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

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

谢谢:)

【问题讨论】:

标签: asp.net html-encode


【解决方案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 );
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-25
        • 1970-01-01
        • 2020-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-25
        相关资源
        最近更新 更多