Mybatis防止sql注入

#{xxx},使用的是PreparedStatement,会有类型转换,因此比较安全;sql

${xxx},使用字符串拼接,能够SQL注入;安全

like查询不当心会有漏动,正确写法以下:mybatis

Mysql: select * from t_user where name like concat('%', #{name}, '%')      spa

Oracle: select * from t_user where name like '%' || #{name} || '%'      日志

SQLServer: select * from t_user where name like '%' + #{name} + '%'orm

关于上述结论能够在xml中验证xml

一、select * from test where id = #{id}对象

随便传个id执行后能够在日志中看到以下结果字符串

select * from test where id = ?编译

原理是采用了jdbc中的PreparedStatement,PreparedStatement是咱们很熟悉的Statement的子类,它的对象包含了编译好的sql语句。这种“准备好”的方式不只能提升安全性,并且在屡次执行一个sql时,可以提升效率,缘由是sql已编译好,再次执行时无需再编译。

二、select * from test order by ${list}

随便传个参数例如id执行后能够在日志中看到以下结果

select * from test order by id

这种是字符串拼接的,存在sql注入隐患

在mybatis中,”${xxx}”这样格式的参数会直接参与sql编译,从而不能避免注入攻击。但涉及到动态表名和列名时,只能使用“${xxx}”这样的参数格式,因此,这样的参数须要咱们在代码中手工进行处理来防止注入。

因此尽可能用#{}这种方式传参数,若是用到了${}方式要手动过滤sql注入。

相关文章
相关标签/搜索