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