桦山涧

桦山涧
Asp.net ---->知识改变命运!
posts - 261, comments - 171, trackbacks - 6, articles - 3
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

1、尽可能使用存储过程,并使用 Parameters 集合来调用它们。结合使用 Parameters 集合和存储过程
下面的代码片断阐释了 Parameters 集合的用法:
SqlDataAdapter myCommand = new SqlDataAdapter("AuthorLogin", conn);
myCommand.SelectCommand.CommandType = CommandType.StoredProcedure;
SqlParameter parm = myCommand.SelectCommand.Parameters.Add("@au_id", SqlDbType.VarChar, 11);
parm.Value = Login.Text;//这里的Login.Text就是安全防范的接口

在本例中,@au_id 参数被视为文本值,而非可执行代码。另外,还针对参数进行了类型和长度检查。在上例中,输入值不能长于 11 个字符。如果数据不遵循由参数定义的类型或长度,就会生成异常。

请注意,使用存储过程不一定会防止 SQL 注入。重要的是结合使用参数和存储过程。如果不使用参数,则在存储过程使用未筛选的输入内容时,它们很容易受到 SQL 注入攻击。例如,下面的代码片断很容易受到攻击:

SqlDataAdapter myCommand = new SqlDataAdapter("LoginStoredProcedure '" +Login.Text + "'", conn);

要点 如果使用存储过程,请确保同时使用参数。

2、结合使用 Parameters 集合和动态 SQL

如果您不能使用存储过程,仍可以使用参数,如下面的代码片断所示:
SqlDataAdapter myCommand = new SqlDataAdapter("SELECT au_lname, au_fname FROM Authors WHERE au_id = @au_id", conn);
SqlParameter parm = myCommand.SelectCommand.Parameters.Add("@au_id",SqlDbType.VarChar, 11);
parm.Value = Login.Text;

从这个代码的例子中我们扩展开来还能想到的当我们调用封装好的类的方法的时候,在写入方法的参数时,我们依然能够用上面的方法进行安全检验("@au_id")

3、使用筛选例程 用来防止 SQL 注入攻击的另一种方法是开发筛选例程,以便向具有特殊 SQL 含义的字符添加转义符。
如单撇号字符。下面的代码片断阐释了一个用来添加转义符的筛选例程:
private string SafeSqlLiteral(string inputSQL)
{
return inputSQL.Replace("'", "''");
}
这种例程存在着一定的问题,而且您不应完全依赖它们,因为攻击者可以使用 ASCII 十六进制字符来回避检查。但是应该筛选输入内容,并将其作为深层防御策略的一部分。

注意 不要依赖筛选输入。

4、使用 LIKE 子句
请注意,如果您使用 LIKE 子句,通配符仍需要转义符。下面的代码片断阐释了这种技术:

s = s.Replace("[", "[[]");
s = s.Replace("%", "[%]");
s = s.Replace("_", "[_]");