用户输入的防注入总结 简介和第三、四、五步

第三步.对不安全代码进行编码

如果您输入文本输入到一个网页,使用HttpUtility.HtmlEncode方法对它进行编码.如果这些文来自于用户输入,数据库或者一个本地文件,请确保总是这样做.

同样地,如果您书写的URL里面包含不安全的字符因为他们来自于用户输入内容,数据库等,使用HttpUtility.UrlEncode方法进行编码.

为了防止存储数据前编码可能会使存储的数据受到破坏,请确保在将它们显示出来时尽可能后面的步骤将它们编码.

使用HtmlEncode对不安全的输出编码

HtmlEncode对HTML标记置换成特殊含文的字符串来表示这些符号而又让浏览器不把它们当作HTML标记来解释处理.比如."<"被置换成&lt; " (冒号) 被替换成&quot; 这些标记被显示成无害的文本.

 

<%@ 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注入攻击

防止跨站脚本攻击

posted @ 2009-05-18 11:26  木饭  阅读(288)  评论(0编辑  收藏  举报