区别:

(1)#将传入的数据都当做一个字符串数组,会对全自动传入的数据加一个双引号。如:order by #user_id#,假如传入的值是id,则解析成的sql为order by "id"。

(2)$将传入的数据立即显示信息转化成在sql中。如:order by $user_id$,假如传入的值是id,则解析成的sql为order by id。

(3)#方式在非常大水平上可以避免 sql注入。

(4)$方式没法避免 sql注入。

(5)$方式一般用以传入数据库目标,比如传入表名。(这儿得留意SQL注入难题

(6)一般可用#的就不要用$。

ps:在应用mybatis中还碰到<![CDATA[]]>的使用方法,在该标记内的句子,将不容易被当做字符串数组来解决,只是立即当做sql语句,例如要实行一个存储过程。

 

小结区别:#{} 传入值时,sql解析时,主要参数是带冒号的,而${}穿进值,sql解析时,主要参数不是带冒号的。

 

举个事例:

select * from ${table_Name} where name = #{name}

在这个事例中,假如表名叫

   user; delete user; --

  则动态性解析以后 sql 以下:

select * from user; delete user; -- where name = ?;

--以后的句子被注解掉,而本来查寻客户的句子变成了查寻全部客户信息 清理数据表的句子,会对数据库导致致命性损害。

可是表名用参数传递进去的情况下,只有应用 ${} 。这也提示在这类使用方法时要当心sql注入的难题。

 

避免 SQL注入方式:

最先,始终不要相信客户的键入。

(1)不应用SQL,考虑到NoSQL。

(2)正则表达式,字符串数组过虑。

(3)主要参数关联PreparedStatement。

(4)应用正则表达式过虑传入的主要参数。

(5)JSP中启用该涵数查验是不是包函非法字符或JSP网页页面分辨编码。JSP参照JSP应用过滤装置避免 SQL注入