15.SQL中的安全问题
15.1 SQL注入简介
SQL是用来和数据库交互的文本语言。
SQL注入(SQL Injection)是利用数据库的外部接口将用户数据插入到实际的SQL中,以达到入侵数据库乃至操作系统的目的。
产生的原因主要由于程序没有对用户输入数据进行严格的过滤,导致非法SQL语句的执行。
SQL注入可能的危害包括:读取、修改、删除数据,获取用户名、密码等信息,获取管理员权限等。
SQL注入很难防范,不能通过操作系统补丁、数据库升级、防火墙进行拦截。
例子:
select * from user where username='$username' and password='$password'
传入参数$username未进行校验时,传入username ' or '1=1,将导致sql被改写为:
select * from user where username='username' or 1=1 and password='password'
将导致用户名和密码全部失效。
或者 传入注释符 username '/*或username '#,将导致sql被改写为:
select * from user where username='username'/*
select * from user where username='username'#
导致密码失效。
15.2 应用开发中可以采取的应对措施
15.2.1 PrepareStatement+Bind-Variable(预编译+绑定变量)
在Mysql上使用绑定变量可有效避免SQL注入。
Java中preparedStatement可有效对单引号进行转义,从而导致非法输入的变量拼接成SQL后,导致SQL报错,防止SQL注入。
15.2.2 使用应用程序提供的转换函数
使用对特殊字符转换的函数来过滤特殊字符,如mysql_real_escape_string()。
15.2.3 自己定义函数进行校验
自行编写输入校验函数,使用正则表达式校验非法输入。
已知非法字符包括:' ; = ( ) /* */ % + "" > < -- [ ]
15.3 小结
MyBatis中要注意$符。