SQL注入是比较常见的网络攻击方式之一,不是BUG是编程逻辑上容易疏忽导致的潜在危险。也是比较常见的老问题了。
作为攻击方,SQL注入的总体思路是这样
1.寻找位置,比如哪个能输入内容的地方。
2.判断服务器类型和后台数据库类型。
3.针对不同的服务器和数据库特点进行SQL注入攻击。
攻击例子
在登录界面里,要求输入用户名和密码:
可以这样输入实现免账号登录:
用户名: ‘or 1 = 1 --
密码:
这个是最基本简单的攻击例子,点击登录,如果没有做特殊处理那么这个非法用户就可以登录进去。(当然现在的有些语言的数据库API已经处理了这些问题)
原理是这样,正常的流程可能是:
"select * from user_table where username=' "+userName+" ' and password=' "+password+" '";
然后输入上面后执行SQL语句的时候变成这样:
SELECT * FROM user_table WHERE username='’or 1 = 1 -- and password=''
条件后面username=”or 1=1 用户名等于 ” 或1=1 那么这个条件一定会成功;然后后面加两个-,这意味着注释,它将后面的语句注释,让他们不起作用,这样语句永远都能正确执行,用户轻易骗过系统,获取合法身份。
然后再来一个更暴力的破坏方式:
SELECT * FROM user_table WHERE username='' ;DROP DATABASE (DB Name) --' and password=''
下面是重点,怎样应对常见的SQL注入攻击(针对JSP说)
1.PreparedStatement(简单有效)
用预编译语句集,它内置了处理SQL注入的能力,具体原理可以看这个:
https://blog.csdn.net/qq_25302531/article/details/80250505
好处
- .代码的可读性和可维护性。
- PreparedStatement尽最大可能提高性能。
- 最重要的一点是极大地提高了安全性。
2.正则表达式、字符串过滤、非法字符、SP页面判断代码
这些都是类似的方式,检测,排除一些字符串特征。然后直接要求用户重新输入合规的字符串进行存储和下一步。需要有耐心和细心尽可能把条件都写全,考虑完整。