2012-07-26 19 views
21

Primero, quiero que todos sepan que estoy usando un motor aspx, no un motor Razor.¿Cómo puedo permitir que las etiquetas HTML se envíen en un cuadro de texto en asp.net?

Tengo una tabla dentro de un formulario. Uno de mi cuadro de texto contiene etiquetas HTML como

</br>Phone: </br> 814-888-9999 </br> Email: </br> [email protected] 

cuando voy a construir él él me da un error que dice

Un valor Request.Form potencialmente peligrosos se detectó desde el cliente (QuestionAnswer="...ics Phone:<br/>814-888-9999<br...").

Intenté la solicitud de validación = "falso" pero no funcionó.

Disculpa, no agregué mi código html para que lo veas hasta ahora. Estoy sacando algunas preguntas donde puedo editarlas, si es necesario.

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<dynamic>" %> 


<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server"> 
EditFreqQuestionsUser 
</asp:Content> 

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 
<script type="text/javascript"> 
$(document).ready(function() { 
    $("#freqQuestionsUserUpdateButton").click(function() { 
     $("#updateFreqQuestionsUser").submit(); 
    }); 
}); 
</script> 
<h2>Edit Freq Questions User </h2> 

<%Administrator.AdminProductionServices.FreqQuestionsUser freqQuestionsUser = ViewBag.freqQuestionsUser != null ? ViewBag.freqQuestionsUser : new Administrator.AdminProductionServices.FreqQuestionsUser(); %> 
<%List<string> UserRoleList = Session["UserRoles"] != null ? (List<string>)Session["UserRoles"] : new List<string>(); %> 
<form id="updateFreqQuestionsUser" action="<%=Url.Action("SaveFreqQuestionsUser","Prod")%>" method="post" onsubmit+> 
<table> 
    <tr> 
     <td colspan="3" class="tableHeader">Freq Questions User Details <input type ="hidden" value="<%=freqQuestionsUser.freqQuestionsUserId%>" name="freqQuestionsUserId"/> </td> 
    </tr> 
    <tr> 
     <td colspan="2" class="label">Question Description:</td> 
     <td class="content"> 
      <input type="text" maxlength="2000" name="QuestionDescription" value=" <%=freqQuestionsUser.questionDescription%>" /> 
     </td> 
    </tr> 
    <tr> 
     <td colspan="2" class="label">QuestionAnswer:</td> 
     <td class="content"> 
      <input type="text" maxlength="2000" name="QuestionAnswer" value="<%=freqQuestionsUser.questionAnswer%>" /> 
     </td> 
    </tr> 
    <tr> 
     <td colspan="3" class="tableFooter"> 
       <br /> 
       <a id="freqQuestionsUserUpdateButton" href="#" class="regularButton">Save</a> 
       <a href="javascript:history.back()" class="regularButton">Cancel</a> 
     </td> 
    </tr> 
    </table> 
     </form> 
</asp:Content> 

Respuesta

23

antes de que la página se presenta lo que necesita a html codificar el valor del cuadro de texto, con window.escape (...)

Si necesita el texto no escapado en el lado del servidor, utilice HttpUtility.UrlDecode(...) método.

muestra muy rápido:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="SO.WebForm1" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
    <script> 
     function makeSafe() { 
      document.getElementById('TextBox1').value = window.escape(document.getElementById('TextBox1').value); 
     }; 

     function makeDangerous() { 
      document.getElementById('TextBox1').value = window.unescape(document.getElementById('TextBox1').value); 
     } 
    </script> 
</head> 
<body> 
    <form id="form1" runat="server" onsubmit="makeSafe();"> 
    <div> 
     <asp:TextBox ID="TextBox1" runat="server" TextMode="MultiLine" Rows="10" ClientIDMode="Static"></asp:TextBox> 
    </div> 
    <asp:Button ID="Button1" runat="server" Text="Button" /> 
    </form> 


    <script> 
     makeDangerous(); 
    </script> 
</body> 
</html> 

hacer estos cambios en su código:

<script type="text/javascript"> 
    $(document).ready(function() { 
     makeDangerous(); 
     $("#freqQuestionsUserUpdateButton").click(function() { 
      makeSafe(); 
      $("#updateFreqQuestionsUser").submit(); 
     }); 
    }); 

    // Adding an ID attribute to the inputs you want to validate is simplest 
    // Better would be to use document.getElementsByTagName and filter the array on NAME 
    // or use a JQUERY select.... 

    function makeSafe() { 
     document.getElementById('QuestionAnswer').value = window.escape(document.getElementById('QuestionAnswer').value); 
    }; 

    // In this case adding the HTML back to a textbox should be 'safe' 
    // You should be very wary though when you use it as actual HTML 
    // You MUST take steps to ensure the HTML is safe. 
    function makeDangerous() { 
     document.getElementById('QuestionAnswer').value = window.unescape(document.getElementById('QuestionAnswer').value); 
    } 
</script> 
+0

Agregué mi html para mostrarle lo que tenía originalmente – Yusuf

+0

¡Perfecto para mí gracias! – Krismorte

1

utilizando HTML en el cuadro de texto no es una buena práctica, tal vez utilizar saltos de línea (Environment.NewLine) o \ r \ n en lugar de br? .NET Reference

Ejemplo (en C#):

textBox1.Multiline = true; 
textBox1.Text = "test" + Environment.NewLine + "test2"; 
+0

puedo usar que en el cuadro de texto// n o/r? – Yusuf

+0

Puse \ n en el cuadro de texto que no funcionó. Tampoco me dio un error. simplemente ingresó el \ n así que ahora es como \ n814-888-9999 – Yusuf

+0

@Yusuf si el tipo del cuadro de texto es de líneas múltiples, ¡sí! Use text1.text = "test" + "\ r \ n" + "test2"; – XhkUnlimit

4

Decora tu acción del controlador con el atributo [ValidateInput]:

[ValidateInput(false)] 
[HttpPost] 
public ActionResult Foo(MyViewModel model) 
{ 
    ... 
} 
+10

-1: Si bien esta es una respuesta válida, no es buena.No creo que sea una buena idea sugerir que los usuarios deshabiliten la validación a ciegas. En su lugar, deben determinar por qué la validación está fallando y luego encontrar una solución que no solo cierre un importante mecanismo de seguridad. Sugerencias como las proporcionadas por [Ted Spence] (http://stackoverflow.com/a/11673224/56864) y [Adrian] (http://stackoverflow.com/a/11673254/56864) son un buen lugar para comenzar. –

+0

@KevinBabcock, * importante mecanismo de seguridad *? Me río de eso. ¿Podría explicar qué es tan importante acerca de esta validación? También está desactivando la validación solo para esta acción en particular. En ASP.NET MVC 3 puede lograr incluso una lógica de grano más fino mediante la decoración de las propiedades de su modelo de vista con el atributo '[AllowHtml]'. ¿De qué sirve usar javascript para escapar de la entrada del usuario antes de enviar? –

+5

en serio? ¿Estás argumentando que la validación de entrada es irrisoria y sin importancia? La "neutralización inadecuada" de la entrada del usuario se encuentra [en la lista de las 3 primeras de las 25 principales vulnerabilidades de seguridad del software actual] (http://www.sans.org/top25-software-errors/). Acabas de decirle al hombre que deshabilite la validación de entrada sin explicación alguna. Sin explicación, sin alternativa, nada. –

3

cliente de JavaScript:

function codificarTags() { 
        document.getElementById('txtDescripcion').value = document.getElementById('txtDescripcion').value.replace(/</g,'&lt;').replace(/>/g,'&gt;'); 
      }; 

<form id="form1" runat="server" onsubmit="codificarTags();"> 

Servidor:

protected void Page_Load(object sender, EventArgs e) 
    { 
     txtDescripcion.Text = txtDescripcion.Text.Replace(@"&lt;", @"<").Replace(@"&gt;", @">"); 
Cuestiones relacionadas