2010-11-02 52 views
4

我在我的asp.net项目的一些webforms中使用FreeTextBox HTML编辑器。如果我不ValidateRequest属性设置为false我得到这个错误:如果我将ValidateRequest设置为false,是不是很危险?

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

它在管理文件夹OK,但因为只有授权用户才获得与它一起工作。但是,像公共页面一样,每个用户都可以留下评论(使用FreeTextBox来收集用户评论)? XSS攻击没有风险吗?如果答案不是,那么ValidateRequest属性是什么?

回答

6

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

它设置为验证默认的响应,因为没有验证潜在的XSS攻击是很危险的,这是更好地得到您没有比有你的网站被黑客入侵实现验证错误。

+0

我使用HttpUtility.HtmlEncode(),验证足够吗? – Mostafa 2010-11-02 08:32:04

+0

@Mostafa:使用'HtmlEncode'足以抵御XSS,但也可能有其他地方需要确保数据编码正确,例如,如果将其存储在数据库中。 – Guffa 2010-11-02 09:05:28

+1

@Mostafa:下载并使用MS AntiXSS Library,其实现与使用Server.HtmlEncode相同,但其用于擦除的charachter库更大且更好用。 – ewitkows 2010-11-02 20:44:50

3

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

的请求验证捕获在跨站脚本攻击和类似最常用的字和词组,但它不能赶上做一个漏洞的无微不至。所以,虽然请求验证提供了对大多数漏洞的保护,但您从来没有完全受到它的保护,但您仍然必须将所有输入视为潜在的恶意。

请求审定的第一个目的是为了保护由人谁是无能XSS攻击和类似的,所以他们也不是完全无保护的内置应用程序。如果您知道如何正确处理输入,并且设法正确实施,则不需要请求验证。

+0

作为一名开发人员,他们始终是“反对某件事”的理由。在一天结束时,你必须记住“纵深防御”的原则。正如@Guffa所说的,请求验证有帮助,但那不是全部。 IE8和其他浏览器倾向于帮助删除XSS,但只要您遵循不信任任何输入的基本模式,那就是最重要的事情。 – ewitkows 2010-11-02 20:47:49

1

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

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。在保存数据库中的字符串之前,您还可以替换字符。

相关问题