解决升级至.net4后出现A potentially dangerous Request.Form value was detected from the client (转载)
转载自:http://123.65.0.169/?vs2010/thread-320-1-6
解决升级至.net4后出现A potentially dangerous Request.Form value was detected from the client
以前在用用vs2005时候也遇到同样的问题时的解决方案:
在页面级别(aspx中)设置 ValidateRequest=”false” 或者 在全局级别(Web.config中)设置 <configuration> <system.web> <pages validateRequest=”false”> 但是当我设置完重新运行的时候问题依然没有解决,还是提示同样的错误,于是在网上搜了相关的资料: 原来 当你在安装了.NET Framework 4.0以上版本后,当你的应用程序以.NET Framework 4.0为框架版本,你的任意服务器请求,都将被进行服务器请求验证(ValidationRequest),这不仅包括ASP.NET,同时也包括Web Services等各种HTTP请求,不仅仅针对aspx页面,也针对HTTP Handler,HTTP Module等,因为这个验证(Valify)的过程,将会发生在BeginRequest事件之前。 在ASP.NET4.0版本上,我们需要更多一行的配置(页面级别也要设置ValidateRequest=”false”): 在全局级别(Web.config中)设置 <configuration> <system.web> <httpRuntime requestValidationMode="2.0" /> 至此,问题得以解决 以上方法存在风险,建议使用以下比较安全的解决方法: 错误: System.Web.HttpRequestValidationException: A potentially dangerous Request.Form value was detected from the client 方法二:正确的做法是在你当前页面添加Page_Error()函数,来捕获所有页面处理过程中产生的而没有处理的异常。然后给用户一个合法的报错信息。要是当前页面没有Page_Error(),这个异常将会送到Global.asax的Application_Error()来处理,你也可以在那里写通用的异常报错处理函数。如果两个地方都没有写异常处理函数,才会显示这个默认的报错页面呢。 举例而言,处理这个异常其实只须要很简短的一小段代码就够了。在页面的Code-behind页面中加入这么一段代码:
这样这个程序就可以截获 HttpRequestValidationException 异常,而且可以按照程序员的意愿返回一个合理的报错信息。 这段代码很简单,所以我希望所有不是真的要允许用户输入之类字符的朋友,千万不要随意的禁止这个安全特性,如果只是须要异常处理,那么请用类似于上面的代码来处理即可。 而对于那些通过 明确禁止了这个特征的程序员,自己一定要明白自己在做什么,而且一定要自己手动的检查必须过滤的字符串,否则你的站点非常容易引发跨站脚本攻击。 关于存在Rich Text Editor的页面应当如何处理? 要是页面有富文本编撰器的控件的,那么必定会导致有类的HTML标签提交回来。在这种状况下,我们不得不将validateRequest="false"。那么安全性怎么处理?如何在这种状况下最大限度的预防跨站脚本攻击呢? 根据微软的建议,我们应该采取安全上称为“默认禁止,显式容许”的策略。 首先,我们将输入字符串用 HttpUtility.HtmlEncode()来编码,将其中的HTML标签彻底禁止。 然后,我们再对我们所感兴趣的、并且是安全标签,通过Replace()进行替换。譬如,我们希望有""标签,那么我们就将""显式的替换回""。 示例代码如下:
这样我们即容许了部分HTML标签,又禁止了危险的标签。 依据微软提供的建议,我们要慎重容许下列HTML标签,因为这些HTML标签都是有可能导致跨站脚本攻击的。
可能这里最让人不能理解的是<img>。但是,看过下列代码后,就应当明白其危险性了。
通过<img>标签是有可能导致Javascript执行的,这样攻击者就可以做他想伪装的任何事情。 关于<style>也是一样:
|