一、什么是sql注入
利用程序员的代码bug,将输入的参数绕过校验并在系统中当做代码运行,从而攻击系统。
二、如何避免sql注入
1.对sql语句进行预编译
PreparedStatement类可以对sql语句进行预编译,那么传入的参数只会被当做参数而不会被当做代码去运行。
2.存储过程
存储过程是被编译后存储在数据库中的,所以它不会有sql注入的隐患。
3.mybatis框架可避免sql注入
mybatis进行参数传递的占位符有两种#{}和${},#{}在进行参数传递时会先进行sql编译然后再替换参数,所以不会有sql注入的问题,${}进行参数传递时会先拼接sql然后进行sql编译,会有安全隐患。因此非特殊情况,尽量使用#{}进行参数传递。
4.mybatis中like的安全风险
select * from test clomn like '%${filed}%'. 该sql语句有注入风险,改为select * from test clomn like concat('%',#{filed},'%')。
5.入参的安全校验
前后端可对输入的参数进行特殊字符过滤,避免别有用心的参数进入。