# 和 &的区别
-
#{}:占位符号,可以防止sql注入(替换结果会增加单引号‘’),解析为一个 JDBC 预编译语句(prepared statement)的参数标记符,一个‘ #{ }’ 被解析为一个参数占位符 ? 。
-
行SQL:Select * from emp where name = #{employeeName}
参数:employeeName=>Smith
解析后执行的SQL:Select * from emp where name = ?
Smith参数在DBMS阶段传入占位符中 -
${}:sql拼接符号(替换结果不会增加单引号‘’,like和order by后使用,存在sql注入问题,需手动代码中过滤), 仅仅为一个纯粹的 string 替换,在动态 SQL 解析阶段将会进行变量替换。在预编译之前已经被变量替换了。
${ }’变量的替换阶段是在动态 SQL 解析阶段,而’#{ }’变量的替换是在 DBMS 中。 -
执行SQL:Select * from emp where name = ${employeeName}
参数:employeeName传入值为:Smith
解析后执行的SQL:Select * from emp where name =Smith
预编译是提前对SQL语句进行预编译,而其后注入的参数将不会再进行SQL编译。我们知道,SQL注入是发生在编译的过程中,因为恶意注入了某些特殊字符,最后被编译成了恶意的执行操作。而预编译机制则可以很好的防止SQL注入。在某些特殊场合下只能用${},不能用#{}。例如:在使用排序时ORDER BY ${id},如果使用#{id},则会被解析成ORDER BY “id”,这显然是一种错误的写法。
sql注入
SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。
注入原因请看