发生场景:不合法的输入条件,导致改变sql语句
示例1:
参数为:http';drop table user -- '[但在mybatis使用时未起作用,因为查询时drop不起作用]
sql为select * from apitest_component where 1=1 and protocol_type = 'http';drop table user #'(这里#是注释功能)
影响结果:会删除其他表
示例2:
参数为:http’ or ‘1=1
sql为select * from apitest_component where 1=1 and protocol_type = 'http' or ’1=1‘
影响结果:过滤条件未起作用,查出所有结果
示例3:
参数为:http'-- '(此时--也可以换#,但#被springmvc过滤掉了)
sql为select * from apitest_component where 1=1 and pro_id=3 and name = 'http'-- ''
影响结果:注释起作用(后面password将不起作用,即可跳过验证)
注:
在编写MyBatis的映射语句时,尽量采用#{xxx}这样的格式。若不得不使用${xxx}这样的参数,要手工地做好过滤工作,来防止SQL注入攻击。
#{}:相当于JDBC中的PreparedStatement
${}:是输出变量的值
简单说,#{}是经过预编译的(即参数类型固定,不可任意填写,且数据操作类型固定,即select操作不会操作delete操作),是安全的;${}是未经过预编译的(参数可任意填写),仅仅是取变量的值,是非安全的,存在SQL注入。