当前位置:首页 > 网络编程 > WEB编程 > ASP.net >  在ASP.NET中防止注入攻击[翻译](1)

 在ASP.NET中防止注入攻击[翻译](1)

点击次数:27 次 发布日期:2008-11-26 12:44:11 作者:源代码网
源代码网推荐      出处: MSDN
源代码网推荐  翻译:云中城 BLOG
源代码网推荐  
源代码网推荐  应用范围:
源代码网推荐  
源代码网推荐  
源代码网推荐  ASP.NET vertion 1.1
源代码网推荐  ASP.NET vertion 2.0
源代码网推荐  
源代码网推荐  
源代码网推荐  概要:
源代码网推荐  
源代码网推荐  文本主要介绍如何校验用户输入从而防止注入式攻击.校验用户输入是非常必要的,几乎所有程序级的攻击都包含恶意输入的手段.
源代码网推荐  
源代码网推荐  你应该校验包括字段,查询字串参数,Cookie等一切用户输入项来保护你的程序免受注入攻击.你得假设所有的用户输入都是恶意的,确保在服务器端对所有的用户输入进行校验.使用基于客户端的验证可以减少页面的住返次数,改进性能,改善用户体验,但是不要仅仅依赖于此,因为客户端的验证很容易就可以被黑客骗过去.
源代码网推荐  
源代码网推荐  为了验证输入内容,你应该为每一个输入字段定义可接受的输入规则.比较好的作法是从输入字段的长度,范围,格式,类型来作约束.使用可接受的字符约束列表而不是非法字符列表来约束输入.使用非法字符列表约束的方式不好,是因为你几乎不可能过滤所有的有害输入.
源代码网推荐  
源代码网推荐  如果你需要接受HTML字符输入,最好使用HtmlEncode之类的方法将它进行编码确保安全再将它们显示出来.
源代码网推荐  
源代码网推荐  内容:
源代码网推荐  
源代码网推荐  目的
源代码网推荐  
源代码网推荐  总括
源代码网推荐  
源代码网推荐  分步实施提要
源代码网推荐  
源代码网推荐  第一步. 使用ASP.NET 请求校验.
源代码网推荐  
源代码网推荐  第二步. 使用权用约束输入.
源代码网推荐  
源代码网推荐  第三步. 对不安全的输入进行编码.
源代码网推荐  
源代码网推荐  第四步. 对Sql语句使用命令参数方式.
源代码网推荐  
源代码网推荐  第五步. 验证ASP.NET的错误没有被返回客户端.
源代码网推荐  
源代码网推荐  额外的资源
源代码网推荐  
源代码网推荐  
源代码网推荐  --------------------------------------------------------------------------------
源代码网推荐  
源代码网推荐  目的:
源代码网推荐  
源代码网推荐  
源代码网推荐  
源代码网推荐  对输入的字串长度,范围,格式和类型进行约束.
源代码网推荐  在开发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.config.comments文件中看到如下的默认设置.
源代码网推荐  
源代码网推荐  <pages validateRequest = "true" ... />
源代码网推荐  
源代码网推荐  确认你没有修改你的服务器的Machine.config和应用程序的Web.config文件里的默认设置.
源代码网推荐  
源代码网推荐  测试ASP.NET请求验证
源代码网推荐  
源代码网推荐  你可以测试请求验证的作用.创建一个ASP.NET页面通过设置ValidateRequest = "fasle"禁用请求验证,代码如下 :
源代码网推荐  
源代码网推荐  
源代码网推荐  
源代码网推荐  <%@ Language="C#" ValidateRequest="false" %>
源代码网推荐  <html>
源代码网推荐   <script runat="server">
源代码网推荐   void btnSubmit_Click(Object sender, EventArgs e)
源代码网推荐   {
源代码网推荐   // If ValidateRequest is false, then "hello" is displayed
源代码网推荐   // If ValidateRequest is true, then ASP.NET returns an exception
源代码网推荐   Response.Write(txtString.Text);
源代码网推荐   }
源代码网推荐   </script>
源代码网推荐   <body>
源代码网推荐   <form id="form1" runat="server">
源代码网推荐   <asp:TextBox id="txtString" runat="server"
源代码网推荐   Text="<script>alert("hello");</script>" />
源代码网推荐   <asp:Button id="btnSubmit" runat="server" OnClick="btnSubmit_Click"
源代码网推荐   Text="Submit" />
源代码网推荐   </form>
源代码网推荐   </body>
源代码网推荐  </html>
源代码网推荐  
源代码网推荐  
源代码网推荐  当你运行页面的时候,"Hello"被显示在一个消息框中,因为在txtString中的脚本被执行并被客户端的浏览器处理.
源代码网推荐  
源代码网推荐  如果你设置ValidateRequest = "true" 或者移除ValidateRequest页面属性,ASP.NET请求验证会拒绝脚本输入并抛出一个象下面这样的错误信息.
源代码网推荐  
源代码网推荐  
源代码网推荐  
源代码网推荐  A potentially dangerous Request.Form value was detected from the client (txtString="<script>alert("hello").
源代码网推荐  
源代码网推荐  
源代码网推荐  注意 不要仅仅依赖请求验证功能,而只是把它作为自定验证的辅导手段.
源代码网推荐  
源代码网推荐  第二步.约束输入
源代码网推荐  
源代码网推荐  要约束输入通过如下方法 :
源代码网推荐  
源代码网推荐  
源代码网推荐  
源代码网推荐  使用服务器端的输入验证.不要依赖于客户端的验证,因为它很容易就被绕过.使用客户端验证是为了减少页面返住次数提升性能,改进用户体验.
源代码网推荐  验证输入的长度,范围,格式和类型.确保输入内容是符合要求的正确内容.
源代码网推荐  使用强数据类型.为数字类型的输入指定如Integer或者Double的类型.为字符输入指定为String数据类型.为日期时间输入指定DateTime类型.
源代码网推荐  要验证表单里面的HTML控件输入字段,在服务器端代码中进行验证,使用Regex正则表达式类型可以帮助约束字符输入.下面的章节介绍如何约束普通输入类型的变量.
源代码网推荐  
源代码网推荐  验证字符串字段
源代码网推荐  
源代码网推荐  
源代码网推荐  
源代码网推荐  要验证字符串字段,如姓名,地址,传真,生份证号码,使用正则表达式.
源代码网推荐  约束可接受的字符范围.
源代码网推荐  启动格式规则.例如,基于模式的字段如税号,邮编,邮递区号需要规定的字符模式.
源代码网推荐  验证长度.
源代码网推荐  
源代码网推荐  
源代码网推荐  使用正则表达式验证控件(RegularExpresionValidator)
源代码网推荐  
源代码网推荐  要使用则表达式验证控件需要设置待验证的控件名(ControlToValidate),验证表达式(ValidationExpression)和出错提示(ErrorMessage).相关的属性设置请看下面的代码示例.
源代码网推荐  
源代码网推荐  
源代码网推荐  
源代码网推荐  <form id="WebForm" method="post" runat="server">
源代码网推荐   <asp:TextBox id="txtName" runat="server"></asp:TextBox>
源代码网推荐   <asp:RegularExpressionValidator id="nameRegex" runat="server"
源代码网推荐   ControlToValidate="txtName"
源代码网推荐   ValidationExpression="^[a-zA-Z".s]{1,40}$"
源代码网推荐   ErrorMessage="Invalid name">
源代码网推荐   </asp:regularexpressionvalidator>
源代码网推荐  </form>
源代码网推荐  
源代码网推荐  
源代码网推荐  
源代码网推荐  在上面的代码中,正则表达式被用于限定输入的名字为字母(允许大写字母和小写字母),空格,单名省略号象O"Dell和句点.此外,输入的字符长度被限定在40个字符.
源代码网推荐  
源代码网推荐  注意 正则表达式验证控件(RegularExpressionValidator)会自动加入脱字符(^)和美元符号($)作为开始和结束的分隔符.如果你没有在自定义的表达式中加入他们那么最好加入.加入分隔符只是为了让你的表达式得到想要的那部分数据内容.
源代码网推荐  
源代码网推荐  使用正则表达式类(Regex Class)
源代码网推荐  
源代码网推荐  如果你没有使用服务器端的控件(意味着你不能使用验证控件),或者你需要其它的输入字段源而非表单字段(比如查询字串参数和cookies),那么你可以使用正则表达式类(Regex class).
源代码网推荐  
源代码网推荐  使用正则表达式类
源代码网推荐  
源代码网推荐  加入使用using前缀的语句导入System.Text.RegularExpressions命名空间.
源代码网推荐  确认正则表达式包含"^"和"$"(字串开始处,字串结束处).
源代码网推荐  调用Regex类的IsMatch方法,下面是代码示例.
源代码网推荐  
源代码网推荐  
源代码网推荐  // Instance method:
源代码网推荐  Regex reg = new Regex(@"^[a-zA-Z".s]{1,40}$");
源代码网推荐  Response.Write(reg.IsMatch(txtName.Text));
源代码网推荐  
源代码网推荐  // Static method:
源代码网推荐  if (!Regex.IsMatch(txtName.Text,@"^[a-zA-Z".s]{1,40}$"))
源代码网推荐  {
源代码网推荐   // Name does not match expression
源代码网推荐  }
源代码网推荐  
源代码网推荐  
源代码网推荐  
源代码网推荐  如果你不能把经常使用的正则表达式缓存起来,你应该使用IsMatch静态方法来改进性能防止不必要的对象创建过程.
源代码网推荐  
源代码网推荐  验证数字字段
源代码网推荐  
源代码网推荐  在大多数情况下,应该验证数字的输入和范围.使用服务器控件验证数字字段的输入和范围,使用RangeValidator控件.RangeValidator支持货币,日期,整型,双精度和字符串类型的数据.
源代码网推荐  
源代码网推荐  使用RangeValidator控件需要设置需要验证的控件名(ControlToValidate),类型(Type),最小值(MinimumValue),最大值(MaximumValue),和出错提示信息(ErrorMessage)属性.下面是代码示例 :
源代码网推荐  
源代码网推荐  
源代码网推荐  
源代码网推荐  <asp:RangeValidator
源代码网推荐   ID="RangeValidator1"
源代码网推荐   Runat="server"
源代码网推荐   ErrorMessage="Invalid range. Number must be between 0 and 255."
源代码网推荐   ControlToValidate="rangeInput"
源代码网推荐   MaximumValue="255"
源代码网推荐   MinimumValue="0" Type="Integer" />
源代码网推荐  
源代码网推荐  
源代码网推荐  如果你没使用服务器控件,你可以将输入值转化成整型再进行验证来完成对数字的范围验证.例如,要验证一个整数是否合法,使用ASP.NET2.0提供的新方法Int32.TryParse将输入值转化为System.Int32的变量类型.这个方法会在转换失败时返回false.
源代码网推荐  
源代码网推荐  
源代码网推荐  
源代码网推荐  Int32 i;
源代码网推荐  if (Int32.TryParse(txtInput.Text, out i) == false)
源代码网推荐  {
源代码网推荐   // Conversion failed
源代码网推荐  }
源代码网推荐  
源代码网推荐  
源代码网推荐  
源代码网推荐  如果你使用早先的ASP.NET版本,可以在try/catch语句块中 使用Int32.Parse或者Convert.ToInt32方法并可以在转换失败时处理抛出的FormatException错误.
源代码网推荐  
源代码网推荐  下面的示例代码演示了如何验证来自HTML文本框的整数类型的类型和范围.
源代码网推荐  
源代码网推荐  
源代码网推荐  
源代码网推荐  
源代码网推荐  
源代码网推荐  
源代码网推荐    做人要厚道,请注明转自酷网动力(www.ASPCOOL.COM)。
源代码网推荐


源代码网供稿.
网友评论 (0)
会员中心
网络编程
本站推荐
网络编程之精华