SQL中#与$的区别
区别:
(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中delete用法
--之后的语句被注释掉,⽽原本查询⽤户的语句变成了查询所有⽤户信息+删除⽤户表的语句,会对数据库造成致命损伤。
但是表名⽤参数传递进来的时候,只能使⽤ ${} 。这也提醒在这种⽤法中要⼩⼼sql注⼊的问题。
防⽌SQL注⼊⽅法:
⾸先,永远不要相信⽤户的输⼊。
(1)不使⽤SQL,考虑NoSQL。
(2)正则表达式,字符串过滤。
(3)参数绑定PreparedStatement。
(4)使⽤正则表达式过滤传⼊的参数。
(5)JSP中调⽤该函数检查是否包函⾮法字符或JSP页⾯判断代码。JSP参考
以上个⼈拙作,希望能给路上同仁带去点光。
若不⼩⼼对你有启发,评论留下你的故事,点赞分享让更多⼈为你受益。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。