每当用户在我的web应用程序中的页面中发布包含<或>的内容时,我都会引发此异常。
我不想因为有人在文本框中输入了字符而引发异常或使整个web应用程序崩溃,但我正在寻找一种优雅的方式来处理这一问题。
捕获异常并显示
出现错误,请返回并重新键入整个表单,但这次请不要使用<
我觉得不够专业。
禁用后验证(validateRequest=“false”)肯定可以避免此错误,但这会使页面容易受到许多攻击。
理想情况下:当发生包含HTML限制字符的回发时,表单集合中的回发值将自动进行HTML编码。因此,我的文本框的.Text属性将是<;html>;
有没有办法让我从处理者那里做到这一点?
如果您使用的是framework 4.0,则web.config中的条目(<pages validateRequest=“false”/>)
<configuration>
<system.web>
<pages validateRequest="false" />
</system.web>
</configuration>
如果您使用的是框架4.5,则web.config中的条目(requestValidationMode=“2.0”)
<system.web>
<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5" requestValidationMode="2.0"/>
</system.web>
如果你只想要一个页面,那么在aspx文件中,你应该把第一行放在下面:
<%@ Page EnableEventValidation="false" %>
如果您已经有类似于<%@页面的内容,那么只需添加rest=>EnableEventValidation=“false”%>
我建议不要这样做。
正如我对Sel回答的评论所指出的,这是我们对自定义请求验证器的扩展。
public class SkippableRequestValidator : RequestValidator
{
protected override bool IsValidRequestString(HttpContext context, string value, RequestValidationSource requestValidationSource, string collectionKey, out int validationFailureIndex)
{
if (collectionKey != null && collectionKey.EndsWith("_NoValidation"))
{
validationFailureIndex = 0;
return true;
}
return base.IsValidRequestString(context, value, requestValidationSource, collectionKey, out validationFailureIndex);
}
}
我找到了一个使用JavaScript编码数据的解决方案,数据在.NET中解码(不需要jQuery)。
使文本框成为HTML元素(如文本区域)而不是ASP元素。添加隐藏字段。将以下JavaScript函数添加到标头中。函数boo(){targetText=document.getElementById(“HiddenField1”);sourceText=document.getElementById(“userbox”);targetText.value=转义(sourceText.innerText);}
在文本区域中,包含一个调用boo()的onchange:
<textarea id="userbox" onchange="boo();"></textarea>
最后,在.NET中,使用
string val = Server.UrlDecode(HiddenField1.Value);
我知道这是单向的-如果你需要双向的,你必须要有创造性,但如果你不能编辑web.config,这就提供了一个解决方案
下面是我(MC9000)通过jQuery创建并使用的示例:
$(document).ready(function () {
$("#txtHTML").change(function () {
var currentText = $("#txtHTML").text();
currentText = escape(currentText); // Escapes the HTML including quotations, etc
$("#hidHTML").val(currentText); // Set the hidden field
});
// Intercept the postback
$("#btnMyPostbackButton").click(function () {
$("#txtHTML").val(""); // Clear the textarea before POSTing
// If you don't clear it, it will give you
// the error due to the HTML in the textarea.
return true; // Post back
});
});
以及标记:
<asp:HiddenField ID="hidHTML" runat="server" />
<textarea id="txtHTML"></textarea>
<asp:Button ID="btnMyPostbackButton" runat="server" Text="Post Form" />
这很有效。如果黑客试图绕过JavaScript发帖,他们只会看到错误。您还可以将所有这些编码的数据保存在数据库中,然后(在服务器端)对其进行解析,并在其他地方显示之前分析和检查攻击。
对于那些不使用模型绑定、从Request.Form中提取每个参数、确信输入文本不会造成伤害的人,还有另一种方法。这不是一个很好的解决方案,但它可以解决问题。
从客户端,将其编码为uri,然后发送。例如:
encodeURIComponent($("#MsgBody").val());
在服务器端,接受它并将其解码为uri。例如:
string temp = !string.IsNullOrEmpty(HttpContext.Current.Request.Form["MsgBody"]) ?
System.Web.HttpUtility.UrlDecode(HttpContext.Current.Request.Form["MsgBody"]) :
null;
or
string temp = !string.IsNullOrEmpty(HttpContext.Current.Request.Form["MsgBody"]) ?
System.Uri.UnescapeDataString(HttpContext.Current.Request.Form["MsgBody"]) :
null;
请查找UrlDecode和UnescapeDataString之间的差异