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

asp.net开发中,经常碰到“从客户端检测到有潜在危险的request.form 值”错误提示,很多人给出的解决方案是:

1、web.config文档<system.web>后面加入这一句: <pages validaterequest="false"/> 
示例: 
<?xml version="1.0" encoding="gb2312" ?> 
<configuration> 
<system.web> 
<pages validaterequest="false"/> 
</system.web> 
</configuration>

2、在*.aspx文档头的page中加入validaterequest="false",示例如下: 
<%@ page validaterequest="false" language="c#" codebehind="index.aspx.cs" autoeventwireup="false" inherits="mybbs.webform1" %> 

其实这样做是不正确的,会给程序安全带来风险。

  asp.net 1.1后引入了对提交表单自动检查是否存在xss(跨站脚本攻击)的能力。当用户试图用之类的输入影响页面返回结果的时候,asp.net的引擎会引发一个 httprequestvalidationexceptioin。这是asp.net提供的一个很重要的安全特性。因为很多程序员对安全没有概念,甚至都不知道xss这种攻击的存在,知道主动去防护的就更少了。asp.net在这一点上做到默认安全。这样让对安全不是很了解的程序员依旧可以写出有一定安全防护能力的网站。

  但是,当我google搜索 httprequestvalidationexception 或者 "a potentially dangerous request.form value was detected from the client"的时候,惊异的发现大部分人给出的解决方案竟然是在asp.net页面描述中通过设置 validaterequest=false 来禁用这个特性,而不去关心那个程序员的网站是否真的不需要这个特性。看得我这叫一个胆战心惊。安全意识应该时时刻刻在每一个程序员的心里,不管你对安全的概念了解多少,一个主动的意识在脑子里,你的站点就会安全很多。

  为什么很多程序员想要禁止 validaterequest 呢?有一部分是真的需要用户输入"<>"之类的字符。这就不必说了。还有一部分其实并不是用户答应输入那些轻易引起xss的字符,而是讨厌这种报错的形式,究竟一大段英文加上一个asp.net典型异常错误信息,显得这个站点出错了,而不是用户输入了非法的字符,可是自己又不知道怎么不让它报错,自己来处理报错。

  对于希望很好的处理这个错误信息,而不使用默认asp.net异常报错信息的程序员们,你们不要禁用validaterequest=false。

  正确的做法是在你当前页面添加page_error()函数,来捕捉所有页面处理过程中发生的而没有处理的异常。然后给用户一个合法的报错信息。假如当前页面没有page_error(),这个异常将会送到global.asax的application_error()来处理,你也可以在那里写通用的异常报错处理函数。假如两个地方都没有写异常处理函数,才会显示这个默认的报错页面呢。

  举例而言,处理这个异常其实只需要很简短的一小段代码就够了。在页面的code-behind页面中加入这么一段代码:

 
 
protected void page_error( object sender, eventargs e)
{
exception ex = server.getlasterror();
if (httpcontext.current.server.getlasterror() is httprequestvalidationexception)
{
httpcontext.current.response.write( " 请输入合法的字符串【<a href=\"javascript:history.back(0);\">返回</a>】 " );
httpcontext.current.server.clearerror();
}
}

  这样这个程序就可以截获 httprequestvalidationexception 异常,而且可以按照程序员的意愿返回一个合理的报错信息。

  这段代码很简单,所以我希望所有不是真的要答应用户输入之类字符的朋友,千万不要随意的禁止这个安全特性,假如只是需要异常处理,那么请用类似于上面的代码来处理即可。

  而对于那些通过 明确禁止了这个特性的程序员,自己一定要明白自己在做什么,而且一定要自己手动的检查必须过滤的字符串,否则你的站点很轻易引发跨站脚本攻击。

  关于存在rich text editor的页面应该如何处理?

  假如页面有富文本编辑器的控件的,那么必然会导致有类的html标签提交回来。在这种情况下,我们不得不将validaterequest="false"。那么安全性怎么处理?如何在这种情况下最大限度的预防跨站脚本攻击呢?

  根据微软的建议,我们应该采取安全上称为“默认禁止,显式答应”的策略。

  首先,我们将输入字符串用 httputility.htmlencode()来编码,将其中的html标签彻底禁止。

  然后,我们再对我们所感爱好的、并且是安全标签,通过replace()进行替换。比如,我们希望有""标签,那么我们就将""显式的替换回""。

 
 
void submitbtn_click( object sender, eventargs e)
{
// 将输入字符串编码,这样所有的html标签都失效了。
stringbuilder sb = new stringbuilder(httputility.htmlencode(htmlinputtxt.text));
// 然后我们选择性的答应<b> 和 <i>
sb.replace( " &lt;b&gt; " , " <b> " );
sb.replace( " &lt;/b&gt; " , " </b> " );
sb.replace( " &lt;i&gt; " , " <i> " );
sb.replace( " &lt;/i&gt; " , " </i> " );
response.write(sb.tostring());
}

 

这样我们即答应了部分html标签,又禁止了危险的标签。

根据微软提供的建议,我们要慎重答应下列html标签,因为这些html标签都是有可能导致跨站脚本攻击的。


<applet> 
<body> 
<embed> 
<frame> 
<script> 
<frameset> 
<html> 
<iframe> 
<img> 
<style> 
<layer> 
<link> 
<ilayer> 
<meta> 
<object>


可能这里最让人不能理解的是<img>。但是,看过下列代码后,就应该明白其危险性了。
<img src="javascript:alert('hello');">

转载于:https://www.cnblogs.com/if404/archive/2010/09/29/1838592.html

根据提供的引用内容,无法直接回答你的问题。引用和引用提供了一些关于字段类型和动态字段的信息,但与从客户端检测潜在危险Request.Form无关。 要从客户端检测潜在危险Request.Form,你可以使用一些安全性工具和技术来帮助你识别和处理潜在的安全问题。以下是一些常见的方法: 1. 输入验证:对于从客户端接收到的所有输入数据,包括Request.Form,都应该进行验证。验证可以包括检查输入的长度、格式、类型和特殊字符等。你可以使用正则表达式或内置的验证函数来实现输入验证。 2. 输出编码:在将从Request.Form获取的输出到响应中时,确保对进行适当的编码,以防止跨站点脚本攻击(XSS)。常见的编码方法包括HTML编码和URL编码。 3. 防范SQL注入:如果你将Request.Form用于构建SQL查询,确保使用参数化查询或预编译语句来防止SQL注入攻击。不要直接将Request.Form拼接到SQL查询字符串中。 4. 防范跨站点请求伪造(CSRF):对于涉及敏感操作的请求,例如更改密码或删除数据,确保使用CSRF令牌来验证请求的合法性。CSRF令牌可以防止恶意网站利用用户的身份进行伪造请求。 5. 安全审计日志:记录所有与Request.Form相关的操作,包括输入验证失败、异常请求和安全事件。这些日志可以帮助你追踪和调查潜在的安全问题。 请注意,以上方法只是一些常见的安全措施,具体的实施方法可能因你使用的编程语言和框架而有所不同。建议你查阅相关的安全文档和指南,以了解更多关于保护Web应用程序安全的最佳实践。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值