SQL中 # 与 $ 的不同

区别:
(1)#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如: #{id},如果传入的值是id,则解析成的sql为"id"。
(2) s q l 将传入的数据直接显示生成在sql中。如: {id},如果传入的值是id,则解析成的sql为id。
(3)#方式在很大程度上能够防止sql注入。
(4) s q l 5 方式无法防止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注入

猜你喜欢

转载自blog.csdn.net/weixin_42966484/article/details/86476212