4

我在我的 asp.net 项目的一些网络表单中使用 FreeTextBox HTML 编辑器。如果我没有将 ValidateRequest 属性设置为 false,我会收到此错误:

从客户端检测到潜在危险的 Request.Form 值

不过在 admin 文件夹中没问题,因为只有授权用户才能使用它。但是公共页面怎么样,比如每个用户都可以发表评论的部分(使用 FreeTextBox 收集用户评论)?XSS 攻击没有风险吗?如果答案不是 Yes ,那么 ValidateRequest 属性是什么?

4

4 回答 4

6

不,你是对的,这有潜在的危险。其背后的想法是 .net 不想限制可以使用其控件执行的操作,但同时消除了许多安全漏洞的可能性。ValidateRequest 属性在那里,因此您可以告诉 ASP.NET,“嘿,不要担心这个。我将自己验证它,因为我预计某些东西对您来说可能看起来很危险。”

默认情况下它设置为验证响应,因为不验证潜在的 xss 攻击是危险的,并且最好得到一个您没有意识到的验证错误,而不是让您的网站被黑客入侵。

于 2010-11-02T08:20:10.337 回答
3

是的,可以禁用请求验证。

请求验证会捕获 XSS 攻击和类似攻击中使用的最常见字符和短语,但它无法捕获所有可能的漏洞利用方式。因此,虽然请求验证提供了对大多数漏洞利用的保护,但您永远不会受到它的完全保护,您仍然必须将所有输入视为潜在的邪恶。

请求验证的第一个目的是保护那些对 XSS 攻击和类似攻击一无所知的人构建的应用程序,使它们不会完全不受保护。如果您知道如何正确处理输入,并且设法正确实施,则不需要请求验证。

于 2010-11-02T09:03:29.420 回答
1

看看MSDN 上的ValidateRequest。这告诉您已扫描输入以查找潜在危险内容。如果您只将输入字段等用于纯文本,这一切都很好。一旦您希望用户提供例如,问题就开始了。指向其他页面的链接,或开始在隐藏的输入字段中保存额外的数据(例如 XML 形式)。ValidateRequest 不会容忍这种内容。ValidateRequest 是一种不错的功能,我几乎总是最终禁用它,但禁用它确实意味着您需要自己对输入进行一些验证。在我看来,无论如何你都应该自己验证输入。

于 2010-11-02T09:48:37.383 回答
1

FreeTexBox 控件和“从客户端检测到潜在危险的 Request.Form 值”

你可以尝试另一个决定

 if(!this.Page.ClientScript.IsOnSubmitStatementRegistered("Replace"))
{
 string script = @"if (Page_IsValid){FTB_API['" + txtBox.ClientID + @"'].initialized=false;   FTB_API['"  + txtBox.ClientID + @"'].htmlEditor.value=FTB_FreeTextBox.prototype.HtmlEncode( FTB_API['" + txtBox.ClientID + @"'].htmlEditor.value);}";
 this.Page.ClientScript.RegisterOnSubmitStatement(this.Page.GetType(), "Replace", script);
}

当您将字符串从服务器发送到客户端应用程序时,不要忘记替换符号

if(!String.IsNullOrEmpty(yourstring)) txtBox.Text= yourstring.Replace("&gt;", ">").Replace("&lt;", "<").Replace("&amp;", "&").Replace("&quot;", ('"').ToString()).Replace("&#146;", "'");

在这种情况下,您不需要关闭 ValidateRequest。您还可以在将字符串保存到数据库之前替换字符。

于 2012-05-31T08:01:29.030 回答