在ASP.NET中防止入攻击[翻译](2)
点击次数:25 次 发布日期:2008-11-26 12:44:09 作者:源代码网
|
源代码网推荐 源代码网推荐 <script runat="server"> 源代码网推荐 源代码网推荐 void Page_Load(object sender, EventArgs e) 源代码网推荐 { 源代码网推荐 if (Request.RequestType == "POST") 源代码网推荐 { 源代码网推荐 int i; 源代码网推荐 if (Int32.TryParse(Request.Form["integerTxt"], out i) == true) 源代码网推荐 { 源代码网推荐 // TryParse returns true if the conversion succeeds 源代码网推荐 if ((0 <= i && i <= 255) == true) 源代码网推荐 { 源代码网推荐 Response.Write("Input data is valid."); 源代码网推荐 } 源代码网推荐 else 源代码网推荐 Response.Write("Input data is out of range"); 源代码网推荐 } 源代码网推荐 else 源代码网推荐 Response.Write("Input data is not an integer"); 源代码网推荐 } 源代码网推荐 } 源代码网推荐 源代码网推荐 </script> 源代码网推荐 源代码网推荐 <html> 源代码网推荐 <body> 源代码网推荐 <form id="form1" action="NumericInput.aspx" method="post"> 源代码网推荐 <div> 源代码网推荐 Enter an integer between 0 and 255: 源代码网推荐 <input name="integerTxt" type="text" /> 源代码网推荐 <input name="Submit" type="submit" value="submit" /> 源代码网推荐 </div> 源代码网推荐 </form> 源代码网推荐 </body> 源代码网推荐 </html> 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 验证日期字段 源代码网推荐 源代码网推荐 你需要验证日期字段是否是正确的类型.在大多数情况下,你也需要验证它们的范围,如验证它们是否是将来或是过去的时间.如果你使用服务器控件来捕获一个日期输入值,同时你希望这个值在一个特定的范围内,你可以使用范围验证控件(RangeValidator)并设置它允许的类型为Date类型.这个控件允许你指定一个特殊的时间段通过设置起始的时刻.如果你需要以今天的时间作为参照来验证,比如验证一个时间是在将来还是过去,你可以使用CustomValidator验证控件. 源代码网推荐 使用CustomValidator控件来验证一个日期需要设置ControlToValidate和ErrorMessage属性,在OnServerValidate事件中指定一个自定义的验证逻辑方法.下面是示例代码. 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 <%@ Page Language="C#" %> 源代码网推荐 源代码网推荐 <script runat="server"> 源代码网推荐 源代码网推荐 void ValidateDateInFuture(object source, ServerValidateEventArgs args) 源代码网推荐 { 源代码网推荐 DateTime dt; 源代码网推荐 源代码网推荐 // Check for valid date and that the date is in the future 源代码网推荐 if ((DateTime.TryParse(args.Value, out dt) == false) || 源代码网推荐 (dt <= DateTime.Today)) 源代码网推荐 { 源代码网推荐 args.IsValid = false; 源代码网推荐 } 源代码网推荐 } 源代码网推荐 源代码网推荐 </script> 源代码网推荐 源代码网推荐 <html> 源代码网推荐 <body> 源代码网推荐 <form id="form1" runat="server"> 源代码网推荐 <div> 源代码网推荐 <asp:Label ID="Label1" Runat="server" 源代码网推荐 Text="Future Date:"></asp:Label> 源代码网推荐 <asp:TextBox ID="futureDatetxt" Runat="server"></asp:TextBox> 源代码网推荐 <asp:CustomValidator 源代码网推荐 ID="CustomValidator1" Runat="server" 源代码网推荐 ErrorMessage="Invalid date. Enter a date in the future." 源代码网推荐 ControlToValidate="futureDatetxt" 源代码网推荐 OnServerValidate="ValidateDateInFuture"> 源代码网推荐 </asp:CustomValidator> 源代码网推荐 <br /> 源代码网推荐 <asp:Button ID="submitBtn" Runat="server" Text="Submit" /> 源代码网推荐 </div> 源代码网推荐 </form> 源代码网推荐 </body> 源代码网推荐 </html> 源代码网推荐 源代码网推荐 源代码网推荐 注意 上面的代码使用的方法DateTime.TryParse是ASP.NET2.0提供的新方法. 源代码网推荐 源代码网推荐 过滤自由文本字段 源代码网推荐 源代码网推荐 过滤输入,你需要使不安全的输入不被当作代码来对待.例如,你的程序使用户不能读取共享数据库内的数据,你首先需要过滤数据使它们在输出的时候没有危险.使用HttpUtility.HtmlEncode方法先对输入值进行编码. 源代码网推荐 源代码网推荐 允许有限的输入HTML代码 源代码网推荐 源代码网推荐 源代码网推荐 在@ Page页面元素内加以下字段ValidateRequest = "false"禁用ASP.NET请求验证 源代码网推荐 使用HtmlEncode方法对输入的字符串进行编码 源代码网推荐 使用StringBuilder对象,调用它的Replace方法对字符中的HTML进行替换 源代码网推荐 下面的代码给出了这种办法的示例.此页面设置ValidateRequest = "fasle"禁用了ASP.NET请求验证.它的HTML编码为了显示简单的文本格式允许使用<b>和<i>标记. 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 <%@ Page Language="C#" ValidateRequest="false"%> 源代码网推荐 源代码网推荐 <script runat="server"> 源代码网推荐 源代码网推荐 void submitBtn_Click(object sender, EventArgs e) 源代码网推荐 { 源代码网推荐 // Encode the string input 源代码网推荐 StringBuilder sb = new StringBuilder( 源代码网推荐 HttpUtility.HtmlEncode(htmlInputTxt.Text)); 源代码网推荐 // Selectively allow and <i> 源代码网推荐 sb.Replace("<b>", "<b>"); 源代码网推荐 sb.Replace("</b>", ""); 源代码网推荐 sb.Replace("<i>", "<i>"); 源代码网推荐 sb.Replace("</i>", ""); 源代码网推荐 Response.Write(sb.ToString()); 源代码网推荐 } 源代码网推荐 </script> 源代码网推荐 源代码网推荐 <html> 源代码网推荐 <body> 源代码网推荐 <form id="form1" runat="server"> 源代码网推荐 <div> 源代码网推荐 <asp:TextBox ID="htmlInputTxt" Runat="server" 源代码网推荐 TextMode="MultiLine" Width="318px" 源代码网推荐 Height="168px"></asp:TextBox> 源代码网推荐 <asp:Button ID="submitBtn" Runat="server" 源代码网推荐 Text="Submit" OnClick="submitBtn_Click" /> 源代码网推荐 </div> 源代码网推荐 </form> 源代码网推荐 </body> 源代码网推荐 </html> 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 验证查询字串的值 源代码网推荐 源代码网推荐 源代码网推荐 验证查询字串的长度,范围,格式和类型.通常,你使用一个合并的正则表达式来完成以下任务: 源代码网推荐 源代码网推荐 约束输入值 源代码网推荐 设置明确的范围检查条件 源代码网推荐 指定输入的类型并将它转换成ASP.NET平台下的类型,处理任何由类型转换引发的异常下面的代码示例演示了使用Regex类验证由查询字串传递过来的名字字符串 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 void Page_Load(object sender, EventArgs e) 源代码网推荐 { 源代码网推荐 if (!System.Text.RegularExpressions.Regex.IsMatch( 源代码网推荐 Request.QueryString["Name"], @"^[a-zA-Z".s]{1,40}$")) 源代码网推荐 Response.Write("Invalid name parameter"); 源代码网推荐 else 源代码网推荐 Response.Write("Name is " + Request.QueryString["Name"]); 源代码网推荐 } 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 验证Cookie值 源代码网推荐 源代码网推荐 象查询字串这样被保存在Cookie里面的值很容易被用户修改.同样地验证这些值的长度,范围,格式和类型. 源代码网推荐 源代码网推荐 验证文件和URL地址 源代码网推荐 源代码网推荐 如果你的程序允许输入文件名,文件地址或者文件存放路径,你需要验证它们的格式是否正确并且根据你的程序实际情况它指向一个有效的位置.如果此步验证失败,你的程序可能会被错误地要求访问文件. 源代码网推荐 源代码网推荐 验证文件路径 源代码网推荐 源代码网推荐 为了避免你的程序被用户利用来访问文件,防止接受用户编写代码输入的文件或者文件路径.例如 : 源代码网推荐 源代码网推荐 如果你接受输入文件名,使用System.IO.Path.GetFileName方法来取得文件的全称 源代码网推荐 如果你不得不接受输入文件路径,使用System.IO.Path.GetFullPath来取得完整的文件路径 源代码网推荐 使用MapPath方法防止跨应用程序的映射 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 如果你使用MapPath方法在服务器上映射一个提供的虚拟目录到一个物理目录,使用Request.MapPath方法的一个带bool参数的重载版本来防止跨应用程序的映射.下面是此项技术的示例代码 : 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 try 源代码网推荐 { 源代码网推荐 string mappedPath = Request.MapPath( inputPath.Text, 源代码网推荐 Request.ApplicationPath, false); 源代码网推荐 } 源代码网推荐 catch (HttpException) 源代码网推荐 { 源代码网推荐 // Cross-application mapping attempted 源代码网推荐 } 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 最终的false参数将会防止跨应用程序的映射.这意味着用户不允许使用".."这样的语法提供一个不在你所指定的虚拟目录里面的非法路径. 源代码网推荐 源代码网推荐 如果你使用服务器控件,你可以使用Control.MapPathSecure方法获取虚拟目录对应的实际目录地址. 源代码网推荐 Control.MapPathSecure方法在访问一个非授权的文件时抛出一个HttpException的异常.需要更多信息,请参看.NET Framework文档中的Control.MapPathSecure方法介绍. 源代码网推荐 源代码网推荐 使用代码访问安全机制限制文件输入输出 源代码网推荐 源代码网推荐 管理员可以通过设置程序使它的可信度为"中"来限制程序向它所在的虚拟目录读写文件的能力..NET代码安全机制可以保证程序在它所在的虚拟目录之外没有任何的文件访问权利. 源代码网推荐 源代码网推荐 要设置一个应用程序的信任度为"中",可以在Web.config或者Machine.config文件中加入: 源代码网推荐 源代码网推荐 <trust level = "Medium" /> 源代码网推荐 源代码网推荐 验证URL 源代码网推荐 源代码网推荐 你可以用象下面的这样的正则表达式来对URL进行特征匹配. 源代码网推荐 源代码网推荐 ^(?:http|https|ftp)://[a-zA-Z0-9.-]+(?::d{1,5})?(?:[A-Za-z0-9.;:@&=+$,?/]|%u[0-9A-Fa-f]{4}|%[0-9A-Fa-f]{2})*$ 源代码网推荐 源代码网推荐 这只是约束输入的格式,不验证它是否在应用程序可接受的范围内.你应该验证它是否在你的程序的上下文中有效.例如,您的应用程序是否跟你指定的服务器进行通讯? 源代码网推荐 源代码网推荐 第三步.对不安全代码进行编码 源代码网推荐 源代码网推荐 如果您输入文本输入到一个网页,使用HttpUtility.HtmlEncode方法对它进行编码.如果这些文来自于用户输入,数据库或者一个本地文件,请确保总是这样做. 源代码网推荐 源代码网推荐 同样地,如果您书写的URL里面包含不安全的字符因为他们来自于用户输入内容,数据库等,使用HttpUtility.UrlEncode方法进行编码. 源代码网推荐 源代码网推荐 为了防止存储数据前编码可能会使存储的数据受到破坏,请确保在将它们显示出来时尽可能后面的步骤将它们编码. 源代码网推荐 源代码网推荐 使用HtmlEncode对不安全的输出编码 源代码网推荐 源代码网推荐 HtmlEncode对HTML标记置换成特殊含文的字符串来表示这些符号而又让浏览器不把它们当作HTML标记来解释处理.比如."<"被置换成< " (冒号) 被替换成" 这些标记被显示成无害的文本. 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 <%@ Page Language="C#" ValidateRequest="false" %> 源代码网推荐 源代码网推荐 <script runat="server"> 源代码网推荐 void submitBtn_Click(object sender, EventArgs e) 源代码网推荐 { 源代码网推荐 Response.Write(HttpUtility.HtmlEncode(inputTxt.Text)); 源代码网推荐 } 源代码网推荐 </script> 源代码网推荐 源代码网推荐 <html xmlns="http://www.w3.org/1999/xhtml" > 源代码网推荐 <body> 源代码网推荐 <form id="form1" runat="server"> 源代码网推荐 <div> 源代码网推荐 <asp:TextBox ID="inputTxt" Runat="server" 源代码网推荐 TextMode="MultiLine" Width="382px" Height="152px"> 源代码网推荐 </asp:TextBox> 源代码网推荐 <asp:Button ID="submitBtn" Runat="server" Text="Submit" 源代码网推荐 OnClick="submitBtn_Click" /> 源代码网推荐 </div> 源代码网推荐 </form> 源代码网推荐 </body> 源代码网推荐 </html> 源代码网推荐 源代码网推荐 源代码网推荐 查看HTML编码的效果,请建立一个虚拟目录将前述的文件放进去,运行此页面,在文本框中输入一些HTML代码,点击提交按钮.例如,下面的输入被当作普通文本来显示. 源代码网推荐 源代码网推荐 Run script and say hello <script>alert("hello");</script> 源代码网推荐 源代码网推荐 如果你移除调用HtmlEncode方法,简单地输入文本的内容,浏览器会执行代码并弹出一个提示框. 源代码网推荐 源代码网推荐 使用UrlEncode 方法对不安全的URL地址进行编码 源代码网推荐 源代码网推荐 如果你需要获取有用户输入部分的URL参数,这可能带来一定的安全风险,使用HttpUtility.UrlEncode方法对这个地址字符串编码. 源代码网推荐 源代码网推荐 HttpUtility.UrlEncode(urlString); 源代码网推荐 源代码网推荐 第四步.对SQL语句使用命令参数方式. 源代码网推荐 源代码网推荐 为了避免注入式攻击请使用SQL的参数方式.参数(Parameters)集合提供类型检测和长度检测.如果你使用参数集合,输入的内容将被当作文本值来对待,数据库不会执行包含在其中的代码.使用参数集方式的一个额外的好处是,你可以严格限定输入的类型和长度.如果输入型超出范围将会触发异常. 源代码网推荐 源代码网推荐 当调用一个存储过程时使用参数集 源代码网推荐 源代码网推荐 下面的代码片段演示了在调用存储过程时使用参数集的例子. 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 SqlDataAdapter myCommand = new SqlDataAdapter("AuthorLogin", 源代码网推荐 myConnection); 源代码网推荐 myCommand.SelectCommand.CommandType = CommandType.StoredProcedure; 源代码网推荐 SqlParameter parm = myCommand.SelectCommand.Parameters.Add( 源代码网推荐 "@LoginId", SqlDbType.VarChar, 11); 源代码网推荐 parm.Value = Login.Text; 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 在创建你自己的SQL语句时使用参数集. 源代码网推荐 源代码网推荐 如果你不能使用存储过程,你仍然可以使用参数集,请看下面的代码. 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 SqlDataAdapter myCommand = new SqlDataAdapter( 源代码网推荐 "SELECT au_lname, au_fname FROM Authors WHERE au_id = @au_id", myConnection); 源代码网推荐 SQLParameter parm = myCommand.SelectCommand.Parameters.Add( 源代码网推荐 "@au_id" ,SqlDbType.VarChar, 11); 源代码网推荐 Parm.Value = Login.Text; 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 如果需要获取更多的如果防止SQL注入攻击的信息请参看How to : Protect From SQL Injection in ASP.NET 源代码网推荐 源代码网推荐 第五步.验证ASP.NET的错误信息没有被返回到客户端 源代码网推荐 源代码网推荐 你可以使用<customErrors>元素来配置客户端,一般的错误信息应该被程序错误检测机制返回到客户端. 源代码网推荐 源代码网推荐 请确认已经更改web.config中的mode属性为"remoteOnly",下面是示例. 源代码网推荐 源代码网推荐 <customErrors mode = "remoteOnly"> 源代码网推荐 源代码网推荐 安在装了一个ASP.NET 的程序之后,你可以按照如下设定指定客户端的错误信息页面。 源代码网推荐 源代码网推荐 <customErrors mode = "on" defaultRedirect = "YourErrorPage.htm"> 源代码网推荐 源代码网推荐 额外的资源,请查看相关主题内容 : 源代码网推荐 源代码网推荐 在ASP.NET中如何使用正则表达式约束输入. 源代码网推荐 源代码网推荐 防止SQL注入攻击 源代码网推荐 源代码网推荐 防止跨站脚本攻击 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 PS: 终于翻完了啊,真累,花了将近三天的时间,其实看看这些句子都很简单的。我第一次做翻译,译得不好的话请大家多多包涵,谢谢。 源代码网推荐 做人要厚道,请注明转自酷网动力(www.ASPCOOL.COM)。 源代码网推荐 源代码网供稿. |
