作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 asp.net 站点....我想知道当用户输入并提交非法字符(xss 攻击)时如何优雅地处理此错误。
“从客户端检测到具有潜在危险的 Request.Form 值 (ctl00$TextBox1="").......等等"
我可以关闭 requestvalidation 属性并编写代码来过滤包含非法字符的字符串,但我认为关闭它不是一个好习惯。我宁愿保留它并优雅地捕获错误说将用户重定向到另一个页面会告诉他/她错误。你会怎么做?
最佳答案
我在一个项目中遇到了同样的问题,我们希望继续使用验证请求选项作为第一道防线。问题在于,在 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 中),以便在适当的时候触发异常。
关于asp.net - 如何在 asp.net 中优雅地处理这个错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2374866/
我是一名优秀的程序员,十分优秀!