我有一个显示字符串的文本字段,其中包含<和>。因此,代码会抛出错误。如何在文本字段中允许使用这些字符?
谢谢:)
答案 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)
将它们转换为<
和>
。在Html中,<
转换为<
,>
转换为>
,而不认为它是标记的一部分。因此字符串<Blah>
将为<Blah>
。
编辑:我忘记了,要自动转换它们并转义所有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"><</asp:TextBox>
我不知道您的问题是否与此相关,或者您是否收到了validateRequest问题
答案 5 :(得分:0)
您可以使用TextBox.Text
属性,该属性将对您输入的任何内容进行HTML编码
<asp:TextBox ID="TextBox1" runat="server" Text="<>"></asp:TextBox>
或者您可以输入<
和>
的
<asp:TextBox ID="TextBox1" runat="server"><</asp:TextBox>
或者您可以输入html代码
<asp:TextBox ID="TextBox1" runat="server"><</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 );
}