正文
首先咱们定义一个类来处理mysql的操作:
这个类有问题吗?
答案是:有!
这个类是有缺陷的,很容易造成sql注入,下面就说说为何会产生sql注入。
为了验证问题的真实性,这里就写一个方法来调用上面的那个类里面的方法,如果出现错误会直接抛出异常。
这个方法非常简单:
一个最常见的select查询语句,也使用了最简单的字符串拼接组成sql语句,很明显传入的参数 testUrl 可控,要想进行注入测试,只需要在testUrl的值后面加上单引号即可进行sql注入测试。
这个不多说,肯定是存在注入漏洞的,脚本跑一遍,看啥结果:
(1064, "You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''t.tips''' at line 1")
回显报错,很眼熟的错误,这里我传入的测试参数是:
t.tips'
下面再说一种导致注入的情况,对上面的方法进行稍微修改:
这个方法里面没有直接使用字符串拼接,而是使用了 %s 来代替要传入的参数,看起来是不是非常像预编译的sql?
那这种写法能不能防止sql注入呢?测试一下便知道,回显如下: