目的:
概述 :
你应该在程序中验证所有的不信任输入.你应该假定所有的用户输入都是非法的.用户可以在应用程序中提供表单字段,查询字串,客户端cookies和浏览器环境值比如用户代理字串和IP地址等.
弱输入校验通常为注入攻击提供了机会.下面是常见的利用弱输入校验或无输入校验进行攻击的手段.
注意 : 注入攻击可通过使用HTTP或HTTPS Secure Socket Layer(SSL) 连接. 传输加密技术不能用来防御攻击.
通常的输入验证方法总结如下.你应在所有的需要通过网络输入的地方进行验证,比如文本框和其它表单输入字段, 查询字串参数,cookies,服务器端变量和网络方法参数.注意,过滤策略应该是只允许正确的输入然后拒绝非法输入.这是因为定义正确的输入策略比过滤所有的非法输入要容易,那通常很难包括所有的非法输入.
通入如下几个方面验证输入内容:
步骤提要
通过以下步骤保护你的ASP.NET程序不受注入式攻击危害 :
下面的章节将对这些步骤进行详细讨论.
第一步.使用ASP.NET请求验证.
默认地,ASP.NET 1.1和2.0请求验证会对送至服务器的数据检测是否含有HTML标记元素和保留字符.这可以防止用户向程序中输入脚本.请求验证会对照一个有潜在威胁的字符串列表进行匹配,如果发现异常它会抛出一个HttpRequestValidationException类型的异常.
你可以在你的web.config文件中的<pages>元素中加入validateRequest=”false” 或在单独的页面的@Pages元素里面设置ValidateRequest = “false”来禁用此项功能.
如果你想禁用请求验证功能,你可以仅在需要的页面禁用它.比如你在程序页面上包含一个可接受HTML格式输入的字段.
确定在Machine.config文件中请求验证功能被打开.
请求验证功能在ASP.NET中被默认启用.你可以在Machine.config.comments文件中看到如下的默认设置.
<pages validateRequest = “true” … />
确认你没有修改你的服务器的Machine.config和应用程序的Web.config文件里的默认设置.
测试ASP.NET请求验证
你可以测试请求验证的作用.创建一个ASP.NET页面通过设置ValidateRequest = “fasle”禁用请求验证,代码如下 :



































































































































































































































































#p#副标题#e#
{
//
If ValidateRequest is false, then ‘hello’ is displayed
//
If ValidateRequest is true, then ASP.NET returns an exception
当你运行页面的时候,”Hello”被显示在一个消息框中,因为在txtString中的脚本被执行并被客户端的浏览器处理.
如果你设置ValidateRequest = “true” 或者移除ValidateRequest页面属性,ASP.NET请求验证会拒绝脚本输入并抛出一个象下面这样的错误信息.
A potentially dangerous Request.Form value was detected from the client (txtString=”<script>alert(‘hello
注意 不要仅仅依赖请求验证功能,而只是把它作为自定验证的辅导手段.
第二步.约束输入
要约束输入通过如下方法 :
要验证表单里面的HTML控件输入字段,在服务器端代码中进行验证,使用Regex正则表达式类型可以帮助约束字符输入.下面的章节介绍如何约束普通输入类型的变量.
验证字符串字段
使用正则表达式验证控件(RegularExpresionValidator)
要使用则表达式验证控件需要设置待验证的控件名(ControlToValidate),验证表达式(ValidationExpression)和出错提示(ErrorMessage).相关的属性设置请看下面的代码示例.









































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































在上面的代码中,正则表达式被用于限定输入的名字为字母(允许大写字母和小写字母),空格,单名省略号象O’Dell和句点.此外,输入的字符长度被限定在40个字符.
注意 正则表达式验证控件(RegularExpressionValidator)会自动加入脱字符(^)和美元符号($)作为开始和结束的分隔符.如果你没有在自定义的表达式中加入他们那么最好加入.加入分隔符只是为了让你的表达式得到想要的那部分数据内容.
使用正则表达式类(Regex Class)
如果你没有使用服务器端的控件(意味着你不能使用验证控件),或者你需要其它的输入字段源而非表单字段(比如查询字串参数和cookies),那么你可以使用正则表达式类(Regex class).
使用正则表达式类
- 加入使用using前缀的语句导入System.Text.RegularExpressions命名空间.
- 确认正则表达式包含”^”和”$”(字串开始处,字串结束处).
- 调用Regex类的IsMatch方法,下面是代码示例.
Instance method:


































































































































































































































































//
Static method:

































































































































#p#副标题#e#
{
//
Name does not match expression
如果你不能把经常使用的正则表达式缓存起来,你应该使用IsMatch静态方法来改进性能防止不必要的对象创建过程.
验证数字字段
在大多数情况下,应该验证数字的输入和范围.使用服务器控件验证数字字段的输入和范围,使用RangeValidator控件.RangeValidator支持货币,日期,整型,双精度和字符串类型的数据.
使用RangeValidator控件需要设置需要验证的控件名(ControlToValidate),类型(Type),最小值(MinimumValue),最大值(MaximumValue),和出错提示信息(ErrorMessage)属性.下面是代码示例 :
如果你没使用服务器控件,你可以将输入值转化成整型再进行验证来完成对数字的范围验证.例如,要验证一个整数是否合法,使用ASP.NET2.0提供的新方法Int32.TryParse将输入值转化为System.Int32的变量类型.这个方法会在转换失败时返回false.
{
//
Conversion failed