"<" 在 ASP.NET 中的文本框中 --> 如何允许呢?

Posted

技术标签:

【中文标题】"<" 在 ASP.NET 中的文本框中 --> 如何允许呢?【英文标题】:"<" in a text box in ASP.NET --> how to allow it? 【发布时间】:2011-05-07 23:23:04 【问题描述】:

我有一个文本字段,它显示一个包含 的字符串。因此,代码会引发错误。如何允许在我的文本字段中使用这些字符?

谢谢:)

【问题讨论】:

***.com/questions/35504083/… @Sachin 这与问题无关。 【参考方案1】:

将它们转换为&amp;lt;&amp;gt;。在 html 中,&amp;lt; 被转换为 &lt;&amp;gt; 被转换为 &gt; 而不认为它是标记的一部分。所以字符串&amp;lt;Blah&amp;gt; 将是&amp;lt;Blah&amp;gt;

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

【讨论】:

是的,但我需要将其显示为 > 和 当它显示在网站上时,它将显示为。 HTML 字符代码用于在显示时显示这些字符,而不会在渲染/编译时被错误地读取。【参考方案2】:
<asp:TextBox ID="TextBox1" runat="server">&lt;</asp:TextBox>

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

【讨论】:

【参考方案3】:

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

函数,它会为你编码任何狡猾的字符。

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

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

【讨论】:

是的,它会将它们转换为 <例如,但我想在文本字段中看到 它应该只在它已经在进行编码的情况下这样做 - 但它不应该首先出错。您是否有可以添加到问题中的代码示例或 URL?如果可能的话,还有你遇到的错误。【参考方案4】:

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

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

或者您可以输入&lt;&gt; 的html 名称。

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

或者你可以输入html代码

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

对于名称和代码转换,请查看this 图表。

【讨论】:

【参考方案5】:

问题是当它被发布到服务器时,它不会工作,不管你尝试什么。这是 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。

【讨论】:

转义?你的意思是?例子? 我认为转义然后解除自己转义比关闭验证没有任何优势。无论哪种方式,您仍然必须确保对重新显示的值进行编码。 @TimAbell - 这样做的好处是您可以只禁用一个控件的验证,而不是整个页面。 很公平。谢谢你的解释。 javascript escape 函数现已弃用。你应该使用encodeURI()【参考方案6】:

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

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

但不要忘记启用 requestValidationMode="2.0"

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

此解决方案可能会带来一些威胁。


另一个聪明的解决方案是通过用户编写的 javascript 文本替换,以确保验证安全:&lt;tag&gt; 被认为是危险的,但 &lt; tag&gt; 被认为是安全的!

替换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();
);

【讨论】:

validateTxt 函数非常适合我。谢谢你的回答 它说 是危险的版本,但你的 validateTxt() 不是那样改变它们吗?【参考方案7】:

您的问题是,您不能在 .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 );
    

【讨论】:

以上是关于"<" 在 ASP.NET 中的文本框中 --> 如何允许呢?的主要内容,如果未能解决你的问题,请参考以下文章

在 '<a href="" action="php here"></a>' 中执行 PHP

如何在 CSS 中模仿 <table border="2" cellpadding="5" cellspacing="0" width

为啥 <input type="number" maxlength="3"> 在 Safari 中不起作用?

为啥 <input type="number" maxlength="3"> 在 Safari 中不起作用?

如何在不使用 $_SESSION["name"] = "<script>document.write(name)</script>";

"Ng-If ="0" <div>" 的内​​容显示在 un-"collapse" 上