我有一个asp.net网站....我想知道如何在用户输入和提交非法字符(xss攻击)时优雅地处理此错误。
“从客户端检测到一个潜在危险的Request.Form值(ctl00 $ TextBox1 =”“).........等”
我可以关闭requestvalidation属性并编写一个代码来过滤带有非法字符的字符串,但我认为将其关闭并不是一个好习惯。我宁愿把它留在上面,并优雅地捕获错误说将用户重定向到另一个告诉他/她错误的页面。你会怎么做?
答案 0 :(得分:2)
我在一个项目中遇到了同样的问题,我们希望继续使用验证请求选项作为第一道防线。问题是在Web表单中,表单值在流程请求的初始阶段进行验证。
我们最终解决这个问题的方式如下:
我们的自定义验证器与下面的类似:
public class UserInputValidator : BaseValidator
{
private HttpRequest Request
{
get { return HttpContext.Current.Request; }
}
protected override bool ControlPropertiesValid()
{
//Override the base functionality because this will check for a control to validate, what we won't do.
return true;
}
protected override bool EvaluateIsValid()
{
bool isValid = true;
var message = new StringWriter();
if (Request != null)
{
//Validate input will enable request validation.
Request.ValidateInput();
NameValueCollection formValues = Request.Form;
foreach (string formKey in formValues.Keys)
{
try
{
#pragma warning disable 168
//Access the form variable to trigger request validation.
string formValue = formValues[formKey];
#pragma warning restore 168
}
catch (HttpRequestValidationException)
{
string orgValue = Request.Unvalidated.Form[formKey];
message.WriteLine("The following input is not allowed: {0}", HttpUtility.HtmlEncode(orgValue));
isValid = false;
}
}
}
ErrorMessage = message.ToString();
return isValid;
}
}
这是有效的,因为禁用请求验证时,不会调用ValidateInput。通过在验证页面时调用此方法,我们强制为请求激活请求验证。
接下来我们要做的是从表单集合中访问每个值(至少在asp.net 4.5中),以便在适当时触发异常。
答案 1 :(得分:1)
在处理任何主要处理之前,此错误发生在页面的更高级别,并导致请求中止。
我相信你唯一的选择是在global.asax中处理Application_Error
方法的异常,然后在需要时重定向到自定义错误页面。
答案 2 :(得分:0)
优雅地处理,你必须自己进行表单检查以找到错误,因此你必须为每个输入元素执行此操作,或者创建一个组件来解析发布的表单集合,这不是一件容易的事。 ..(或至少检查相关领域)。
然后您可以使用该消息重定向到错误页面。或者,如果你打开它,就像已经提到的那样处理Application_Error(或者可能是页面中的OnError方法),你可以将它们重定向到带有这条消息的错误页面,基本上做同样的事情。
答案 3 :(得分:0)
首先检查JavaScript,并立即显示错误消息。并且正如Mitchel所说,在Application_Error事件中复制此检查。