# 和 &的区别

  • Post author:
  • Post category:其他




# 和 &的区别

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

注入原因

请看



版权声明:本文为u013915286原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。