防SQL注入攻击

1、 SQL注入案例

与数据库交互的 Web 应用程序中最严重的风险之一:SQL 注入攻击。SQL 注入是应用程序开发人员未预期的把 SQL 代码传入到应用程序的过程,它由于应用程序的糟糕设计而使攻击成为可能,并且只有那些直接使用用户提供的值构建 SQL 语句的应用程序才会受影响。

SQL 语句通过字符串的构造技术动态创建,文本框的值被直接复制到字符串中,可能是这样的:

string sql = "select * from admininfo where Admin_Name='xiyangyang'";

在这个示例中,用户可以篡改 SQL 语句,通常,攻击的第一个目标是得到错误信息。如果错误没有被恰当处理,底层的信息就会暴露给攻击者。现在若是在文本框中输入:xiyangyang’ or ‘1’='1,再看看这条 SQL 语句,它现在是这样的:

string sql = "select * from admininfo where Admin_Name='xiyangyang' or '1'='1'";

这样产生的后果是没有显示当前用户的特定信息,却向攻击者提供了全部资料,如果屏幕上显示的是敏感信息,如社会保险号,生日或者信用卡资料等,就会带来严重的问题!

还可以进行更复杂的攻击!例如攻击者可以利用两个连接号(–)注释掉 SQL 语句剩余部分,虽然这样的攻击只限于SQL Server,不过对于其他类型的数据库也有等效的办法。另外,攻击者还可以执行含有任意 SQL 语句的批处理命令,对于 SQL Server,攻击者只需加上分号(;),攻击者用这样的方式还可以删除其他表的内容。

下面是攻击者在文本框中输入的,他的目的是删除 admininfo表的全部行:xiyangyang’ ; delete from AdminInfo where ‘1’='1,得到的 SQL 语句是这样:

“select * from admininfo where Admin_Name='xiyangyang';delete from AdminInfo where '1'='1'”

2、防SQL注入攻击

预防手段:
·

  1. 使用 TextBox.MaxLength 属性防止用户输入过长的字符,这样减少了贴入大量的脚本的可能性·
  2. 使用 ASP.NET 验证控件锁定错误的数据·
  3. 限制错误信息给出的提示,捕获到异常时只显示一些通用的信息,而不是显示 Exception.Message 属性中的信息,它会暴露出系统的攻击点·
  4. 更为重要的是,一定要小心去掉特殊字符,比如将单引号替换为两个单引号·
  5. 最好的解决方法是使用参数化的命令或者使用存储过程执行转义以防止 SQL 注入攻击

使用参数化命令:

参数化命令是在 SQL 文本中使用占位符的命令,占位符表示需要动态替换的值,它们通过 Command 对象的 Parameters 集合来传送。
例如下面这条SQL语句:

string sql = "select * from admininfo where Admin_Name='xiyangyang'";

可以写成这样:

string sql = "select * from admininfo where Admin_Name=@AdminName";

为每个参数创建一个 Parameter 对象,这些对象被加入到 Command.Parameters 集合中。下面的示例重写前面的代码防止可能的 SQL 注入攻击

python sqlite防注入 sql语句防注入_python sqlite防注入

若在修改后的页面上再次尝试 SQL 注入攻击,将得不到任何记录。因为没有Admin_Name值与 文本框输入的 xiyangyang’ OR ‘1’ = ‘1’ 相等的订单项,这正是我们期待的结果。

python sqlite防注入 sql语句防注入_SQL注入_02

cmd.Parameters是对象里面的一个属性,返回值是一个集合
有时会用到同样的变量名 所以在绑定参数之前先清除一下cmd.Parameters.Clear();