赞
踩
Mybatis在处理#{}时,会将SQL中的#{}使用占位符?代替,调用PreparedStatement的set方法进行赋值,真正查询时即在DBMS才会带入参数。相当于先编译好SQL语句再取值
${}则是简单的替换,相当于先取值再编译SQL语句。
存在问题:
${}会导致SQL注入,#{}则不会。
SQL注入:指把用户输入的数据拼接到sql语句后面作为sql语句的一部分执行
解决SQL注入:
(1)、JDBC使用 PreparedStatement代替Statement, PreparedStatement 不仅提高了代码的可读性和可维护性.而且也提高了安全性,有效防止sql注入;
(2)、能使用#{}的地方应尽量使用#{};
原则上:
(1)、为防止SQL注入,一般情况下都使用#{};
$方式一般用于传入数据库对象,例如当传入参数为字段名、表名、排序方式、固定常量时则可以使用;这时可能导致sql注入,解决方法:此时需要手工过滤,如通常 order by 的字段名是有限的,因此可以使用白名单的方式来限制参数值。
(2)#{}可以有效防止SQL注入
${}可能导致SQL注入,能不用就不要用。
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。