SQL注入原理:
攻击者通过构造带有恶意语句的输入数据,修改或查询数据库中的数据,甚至获取管理员权限,通常会将用户提供的输入参数组合成SQL查询语句来与数据库进行交互
攻击者可以在输入框、网址后面添加参数等任意可输入数据的地方,向数据处理模块输入一些特殊字符,例如'、"、/*等,直接变成恶意的SQL语句,然后就做一些查询、修改、删除数据、绕过身份验证并获取管理员权限等等
简单验证:
确认注入点,通过某个输入框提交的参数是否能够直接拼接到SQL语句中。
1、尝试输入'or' 1=1'('or' 1=1'是一个经典的SQL注入语句,可绕过登录验证,还有其他很多万能密码,可自行选择输入),观察页面的响应是否与正常情况有差异,列表展示情况等查看
2、尝试使用其他的SQL注入语句,例如'and' 1=2'、'union select xxx'等,查看页面响应是否与预期相符。
3、在注入语句加上sleep(n),观察响应时间的变化来猜测n的值;
SELECT * FROM users WHERE username = 'admin' and sleep(5)
4、在数据库中插入一些特定的数据,查看响应页面是否有对应信息的输出
编码注意事项:
方法一:
使用预编译;预编译是指使用占位符接收数据替换为SQL语句,占位符不依赖于字符串连接来创建要发送到数据库的SQL语句。在Java中,通过java.sql.PreparedStatement接口的prepareStatement方法对SQL进行预编译,达到防止SQL注入的目的;
方法二:
使用安全存储过程;使用安全存储过程效果和使用预编译语句类似,区别是存储过程将SQL语句定义在数据库中;
方法三:
转义用户输入;为修复SQL注入漏洞,将所有SQL语句重写成预编译语句或存储过程是非常耗时的,也会对系统性能造成影响,这时可以将用户输入的命令进行转义,将可能恶意执行的字符转义为无法执行的字符串。