天天看点

SQL注入常见的安全问题

SQL注入是一个安全问题,因为应用程序使用拼接SQL的技术而成为hacker攻击后台的方式。下面就介绍一下2种SQL注入,及解决SQL注入的方法。

1.基于 1=1 总为真

SQL注入常见的安全问题
SELECT * FROM Users WHERE UserId = 105 OR 1=1;
           

只需在输入字段中插入105或1=1,就可以访问数据库中的所有用户名和密码。

2.标题基于批处理SQL

SQL注入常见的安全问题
SELECT * FROM Users WHERE UserId = 105; DROP TABLE Suppliers;
           

删除表Suppliers,很明显对数据库进行破坏,可能造成后台瘫痪。

3.模糊查询注入a%’ exec master…xp_cmdshell ‘net user test testpass /ADD’

sql:="SELECT * FROM products WHERE name LIKE '%"+prod+"%'"
Db.Exec(sql)
           

如果攻击提交 a%’ exec master…xp_cmdshell ‘net user test testpass /ADD’ – 作为变量 prod的值,那么sql将会变成

sql:="SELECT * FROM products WHERE name LIKE '%a%' exec master..xp_cmdshell 'net user test testpass /ADD'--%'"
           

服务器会执行这条SQL语句,包括它后面那个用于向系统添加新用户的命令。 如果这个程序是以sa运行而 数据库服务又有足够的权限的话,攻击者就可以获得一个系统帐号来访问主机了

预防SQL注入

  1. 严格限制Web应用的数据库的操作权限,给此用户提供仅仅能够满足其工作的最低权限,从而最大限度的减少注入攻击对数据库的危害。
  2. 检查输入的数据是否具有所期望的数据格式,严格限制变量的类型,例如使用regexp包进行一些匹配处理, 或者使用strconv包对字符串转化成其他基本类型的数据进行判断。
  3. 对进入数据库的特殊字符(’”尖括号&*;等)进行转义处理,或编码转换。
  4. 所有的查询语句建议使用数据库提供的参数化查询接口,参数化的语句使用参数而不是将用户输入变量嵌入到SQL语句中, 比如Java中的PrepareStatement。
  5. 在应用发布之前建议使用专业的SQL注入检测工具进行检测, 以及时修补被发现的SQL注入漏洞。网上有很多这方面的开源工具,例如sqlmap、SQLninja等。
  6. 避免网站打印出SQL错误信息,比如类型错误、字段不匹配等,把代码里的SQL语句暴露出来,以防止攻击者利用这些错误信息进行SQL注入