"<" 在 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】:将它们转换为&lt;
和&gt;
。在 html 中,&lt;
被转换为 <
和 &gt;
被转换为 >
而不认为它是标记的一部分。所以字符串&lt;Blah&gt;
将是&lt;Blah&gt;
。
编辑:我忘了,要自动转换它们并转义所有 HTML 字符(所以这对其他东西来说不是问题),在 Asp.net 中你可以使用 Server.HtmlEncode(string)
自动转换所有可能导致其 HTML 等效项出现问题的字符。
【讨论】:
是的,但我需要将其显示为 > 和 当它显示在网站上时,它将显示为。 HTML 字符代码用于在显示时显示这些字符,而不会在渲染/编译时被错误地读取。【参考方案2】:<asp:TextBox ID="TextBox1" runat="server"><</asp:TextBox>
我不知道您的问题是否与此相关,或者您是否遇到了 validateRequest 问题
【讨论】:
【参考方案3】:如果您在 asp.net 页面中,您可以将整个输出文本包装在一个
Server.HtmlEncode("YourTextWith<and>Characters")
函数,它会为你编码任何狡猾的字符。
如果出于某种原因,您在 .cs 文件中执行此操作,则可以使用 System.Web.HttpUtility.HtmlEncode("YourTextWith<and>Characters")
在将其传递给表示层之前。
【讨论】:
是的,它会将它们转换为 <例如,但我想在文本字段中看到 它应该只在它已经在进行编码的情况下这样做 - 但它不应该首先出错。您是否有可以添加到问题中的代码示例或 URL?如果可能的话,还有你遇到的错误。【参考方案4】:您可以使用TextBox.Text
属性,它将对您输入的任何内容进行 HTML 编码
<asp:TextBox ID="TextBox1" runat="server" Text="<>"></asp:TextBox>
或者您可以输入<
和>
的html 名称。
<asp:TextBox ID="TextBox1" runat="server"><</asp:TextBox>
或者你可以输入html代码
<asp:TextBox ID="TextBox1" runat="server"><</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 - 这样做的好处是您可以只禁用一个控件的验证,而不是整个页面。 很公平。谢谢你的解释。 javascriptescape
函数现已弃用。你应该使用encodeURI()
。【参考方案6】:
最简单的解决方案是在单个页面中禁用请求验证
<%@ 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();
);
【讨论】:
validateTxt
函数非常适合我。谢谢你的回答
它说 您的问题是,您不能在 .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>";