sql注入是什么?
sql是我们操作数据库与其交互的语言,而sql注入是用户将Web页面的原URL、表单域或数据包输入的参数,修改拼接成sql语句,传递给Web服务器,进而传给数据库服务器。由于程序编写人员对于提交到数据库的请求没有进行验证和过滤导致拼接的sql语句被执行很有可能导致数据库的数据被获取,这就叫sql注入攻击。
上面说的 可能有一点复杂,其实sql注入简单来说就是将sql语句添加到输入的参数当中传递到数据库执行的一种攻击手段
sql注入的危害
1、可以获取到数据库的信息
2、可以修改信息
3、可以安装木马
4、可以执行系统命令
sql注入的几种方式
数字型注入
当输入的参数为整型时,如ID、年龄、页码等,如果存在注入漏洞,则可以认为是数字型注入。这种数字型注入最多出现在ASP、PHP等弱类型语言中,弱类型语言会自动推导变量类型,例如,参数id=8,PHP会自动推导变量id的数据类型为int类型,那么id=8 and 1=1,则会推导为string类型,这是弱类型语言的特性。而对于Java、C#这类强类型语言,如果试图把一个字符串转换为int类型,则会抛出异常,无法继续执行。所以,强类型的语言很少存在数字型注入漏洞。
假如我们查询一个用户的信息 sql语句应该是
select * from user where user_id=1
但是如果我们发送的请求是
select * from user where user_id=1 or 1=1
那么我们这个就算是一个sql注入攻击了,会返回我们所有用户的信息。
为什么呢?
因为1=1永远是true,where条件相当于没有了
字符串注入
用mysql举栗子,MySQL中有两种注释方法
1、’#’:’#'后所有的字符串都会被当成注释来处理
用登录来说,我们登录一般是
select * from user where userName= 'user' and pwd='123'
但是当我们传入的参数是user’#(单引号闭合user左边的单引号),密码随便输入一个,就会#后面都被注释掉
select * from user where userName= 'user'# and pwd='123'
那么我们就可以直接无密码或者密码错误也能登录到该用户的账号
2、’-- ’ (–后面有个空格):’-- ‘后面的字符串都会被当成注释来处理
当我们输入参数user’-- (注意–后面有个空格,单引号闭合user左边的单引号),密码也随便输入
SELECT * FROM user WHERE username = 'user'-- 'AND password = '111'
这样子也可以无密码或者密码错误但是成功登录到该用户的账号
关于mybatis中传递变量用#的原因
在MyBatis中,如果写${变量名},则为直接把传入的值填充到SQL语句中;
如果写#{变量名},则为传入的值只能作为值,放到SQL语句中。
举例:
DELETE FROM student WHERE name=${stu_name}
如果这样写,假如用户恶意传入这样一个字符串:'abc' OR 1=1,
那么整个SQL就变成了
DELETE FROM student WHERE name=abc OR 1=1,
结果就是全部数据都删掉了。这就是SQL注入,如果把${stu_name}换成#{stu_name},那么依然传入上面的字符串,
那么SQL是这样的:
DELETE FROM student WHERE name=`abc OR 1=1`,会删除名字为abc OR 1=1的学生
没有这个学生则什么都删除不掉,这样就防止了SQL注入。