# 和 &的区别
-
#{}:占位符号,可以防止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语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。
注入原因
请看