如果我将ValidateRequest设置为false并不危险?

时间:2010-11-02 08:16:18

标签: asp.net validation xss freetextbox

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

  

从客户端

检测到潜在危险的Request.Form值

虽然在管理员文件夹中没有问题,因为只有授权用户才有权使用它。但是公共页面怎么样,每个用户都可以访问的部分留下评论(使用FreeTextBox收集用户评论)?对XSS攻击没有风险吗?如果答案不是,那么什么是ValidateRequest属性?

4 个答案:

答案 0 :(得分:6)

不,你是对的,这有潜在危险。它背后的想法是.net不想限制它的控件可以做什么,但同时消除了安全漏洞的许多可能性。 ValidateRequest属性就在那里,所以你可以告诉ASP.NET,“嘿,不要担心这个。我将自己验证它,因为我期待一些可能对你来说很危险的东西。”

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

答案 1 :(得分:3)

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

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

请求验证的第一个目的是保护由对XSS攻击无关的人员构建的应用程序,以便它们不会完全不受保护。如果您知道如何正确处理输入,并且还设法正确实现输入,则不需要请求验证。

答案 2 :(得分:1)

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

答案 3 :(得分: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。您还可以在将字符串保存到数据库之前替换字符。