“<”在ASP.NET的文本框中 - >怎么容许呢?

时间:2010-11-10 15:51:30

标签: asp.net html-encode

我有一个显示字符串的文本字段,其中包含<和>。因此,代码会抛出错误。如何在文本字段中允许使用这些字符?

谢谢:)

7 个答案:

答案 0 :(得分:22)

问题是,当它被发布到服务器时,它将无法工作,无论你尝试什么。这是ASP.NET XSS保护,可以像这样禁用:

<%@ Page ... ValidateRequest="false" %>

麻烦的是,你必须非常小心地自己验证所有的回发。更简单的方法是在发布之前使用javascript转义文本框的所有内容。您可以使用相同的HTML转义来转义它,然后在服务器端代码中转义它。

<强>更新 逃逸的例子。这将在回发之前在屏幕上闪烁更改的文本 - 理想的解决方案是为此使用隐藏字段,即将值分配给隐藏字段,而不是相同的字段。这是最简单的版本:

<script>
  function EscapeField(){
    document.getElementById("your client control ID").value = 
       escape(document.getElementById("your client control ID").value);
  }
</script>

在代码隐藏中:

this.ClientScript.RegisterOnSubmitStatement(this.GetType(), 
    "EscapeField", "EscapeField();")

<强>更新 再次,警告 - 如果您像这样在数据库中保存HTML,然后只是将其显示给客户端,您就会直接受到XSS攻击。有些蠕虫可以找到并利用您的网站。确保清理你得到的HTML。

答案 1 :(得分:8)

如果您在asp.net页面中,则可以将整个输出文本包装在一个 Server.HtmlEncode("YourTextWith<and>Characters")

功能,它会为你编码任何狡猾的字符。

如果出于某种原因,您在.cs文件中执行此操作,则可以使用System.Web.HttpUtility.HtmlEncode("YourTextWith<and>Characters")

在将其传递给表示层之前。

答案 2 :(得分:4)

将它们转换为&lt;&gt;。在Html中,&lt;转换为<&gt;转换为>,而不认为它是标记的一部分。因此字符串<Blah>将为&lt;Blah&gt;

编辑:我忘记了,要自动转换它们并转义所有HTML字符(所以这不是其他问题),在Asp.net中你可以使用Server.HtmlEncode(string)来自动将可能导致问题的所有字符转换为HTML等效字符。

答案 3 :(得分:2)

最简单的解决方案是在单个页面中禁用请求验证

<%@ Page ... ValidateRequest="false" %>

但不要忘记启用requestValidationMode =“2.0”

<system.web>
   ...
   <httpRuntime requestValidationMode="2.0" />
</system.web>

此解决方案可能会产生一些威胁。


另一个智能解决方案是通过用户编写的javascript文本替换以确保安全:<tag>被认为是危险的,但< tag>被认为是安全的!

javascript替换可以解决问题。

function validateTxt() {
    $("textarea, input[type='text']").change(function () {
      html = $(this).val(); //get the value
      //.replace("a" , "b")  works only on first occurrence of "a"
      html = html.replace(/< /g, "<"); //before: if there's space after < remove
      html = html.replace(/</g, "< "); // add space after <
      $(this).val(html); //set new value
   });
}

$(document).ready(function () {
      validateTxt();
});

答案 4 :(得分:0)

<asp:TextBox ID="TextBox1" runat="server">&lt;</asp:TextBox>

我不知道您的问题是否与此相关,或者您是否收到了validateRequest问题

答案 5 :(得分:0)

您可以使用TextBox.Text属性,该属性将对您输入的任何内容进行HTML编码

<asp:TextBox ID="TextBox1" runat="server" Text="<>"></asp:TextBox>

或者您可以输入<>

<asp:TextBox ID="TextBox1" runat="server">&lt;</asp:TextBox>

或者您可以输入html代码

<asp:TextBox ID="TextBox1" runat="server">&#60;</asp:TextBox>

有关名称和代码转换的信息,请查看this图表。

答案 6 :(得分:0)

你的问题是,你不能在.net控件中使用html标签。所以在aspx页面中设置ValidateRequest =“false”并在保存文本之前对文本进行编码。

    //encode
    private string Encode(string text)
    {
        byte[] encodedText = System.Text.Encoding.UTF8.GetBytes(text);
        return System.Convert.ToBase64String(encodedText);
    }

检索文本时,请务必解码编码文本。

    // Decode:
    private string Decode(string encodedText)
    {
        byte[] decodedText = System.Convert.FromBase64String(encodedText);
        return System.Text.Encoding.UTF8.GetString(decodedText );
    }