目的: 对输入的字串长度,范围,格式和类型进行约束.? 在开发 ASP.NET 程序时使用请求验证防止注入攻击.? 使用 ASP.NET 验证控件进行输入验证.? 对不安全的输出编码.? 使用命令参数集模式防止注入攻击.? 防止错误的详细信息被返回到客户端.? 概述?: 你应该在程序中验证所有的不信任输入.你应该假定所有的用户输入都是非法的.用户可 以在应用程序中提供表单字段,查询字串,客户端 cookies 和浏览器环境值比如用户代理字串 和 IP 地址等. 弱输入校验通常为注入攻击提供了机会.下面是常见的利用弱输入校验或无输入校验进 行攻击的手段. SQL?注入(SQL?injection).?如果你使用用户的输入值来动态构造 SQL 语句,那么数据库可能 执行攻击性的有害 SQL 语句.? 跨站脚本(Cross-site?scripting).?跨站脚本攻击利用网页验证漏洞注入客户端脚本.接下 来这些代码被发送到受信任的客户端电脑上并被浏览器解释执行.因为这些代码来自受信任 的站点,所以浏览器无法得知这些代码是有害的.? 未授权的文件访问(Unauthorized?file?access).如果你的代码从调用者那里接受输入,恶意 用户可以看到你对文件的操作过程从而访问那些受保护的文件或者使用你的代码注入非法数 据.?
注意?:?注入攻击可通过使用 HTTP 或 HTTPS?Secure?Socket?Layer(SSL)?连接.?传输加 密技术不能用来防御攻击. 通常的输入验证方法总结如下.你应在所有的需要通过网络输入的地方进行验证,比如文 本框和其它表单输入字段,?
查询字串参数,cookies,服务器端变量和
网络方法参数.注意,过 滤策略应该是只允许正确的输入然后拒绝非法输入.这是因为定义正确的输入策略比过滤所 有的非法输入要容易,那通常很难包括所有的非法输入. 通入如下几个方面验证输入内容: 约束.验证是否输入的是正确的类型,字符长度,格式和范围.可以应用 ASP.NET 验证控件来约 束服务器控件输入.约束其它来源的输入可以使用正则表达式和自定义的验证规则.? 拒绝.检测已知的有害数据输入并拒绝.?
过滤.有时候你会希望过滤掉用户输入中那些有安全隐患的那些部分.例如,你的程序允许自 由格式的输入,比如备注字段,你会允许特定的安全 HTML 标记象<b>,<i>及其它的 HTML 标记.? 步骤提要 通过以下步骤保护你的 ASP.NET
程序不受注入式攻击危害?: 第一步.使用 ASP.NET 请求验证.? 第二步.约束输入.? 第三步.对不安全的输出进行编码.? 第四步.对 SQL 查询语句使用命令参数.? 第五步.验证 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.configments 文件中看到 如下的默认设置. <pages?validateRequest?=?"true"?...?/>?
确认你没有修改你的服务器的 Machine.config 和应用程序的 Web.config 文件里的默认 设置. 测试 ASP.NET 请求验证 你 可 以 测 试 请 求 验 证 的 作 用 . 创 建 一 个 ASP.NET 页 面 通 过 设 置 ValidateRequest?=?"fasle"禁用请求验证,代码如下?:?
<%@?Language="C#"?ValidateRequest="false"?%> <html> ?<scr