Mybatis 里,说用$,会产生 sql 注入的问题,这个如何理解?

2017-04-04 16:13:50 +08:00
 esolve
2132 次点击
所在节点    问与答
5 条回复
ixiaozhi
2017-04-04 16:35:31 +08:00
select * from table where id = ${id} =====> ${id} -> 1;drop table ....... =====> select * from table where title = 1; drop table .....
zacharyjia
2017-04-04 16:39:36 +08:00
@ixiaozhi 我猜 lz 是在问 $ 和 # 的区别
ixiaohei
2017-04-04 17:06:07 +08:00
$是静态替换,相当于最后替换字符串。#是动态的,原理是 prepearStatement 占位符。应该是 JDBC 驱动做的转换,比较安全,推荐方式。但是很多场景 prepearStatement 处理不了,我记得替换表名应该是处理不了要用$,其他的用#。具体可以 mybatis 源代码,做了两步转换的。第一步静态替换就是处理$。第二部处理#.
esolve
2017-04-04 18:39:48 +08:00
@ixiaozhi 你意思是 譬如
select * from table where username = ${name}

用户在对话框输入一个用户名为 1;drop table
然后就 select * from table where username = 1; drop table

如果 select * from table where username = #{name}
用户输入 1;drop table

select * from table where username = “ 1; drop table ”

这样#使得这个 sql 无效
而$使得 sql 有效?
msg7086
2017-04-05 03:40:44 +08:00
@esolve 我没用过 Mybatis ,只从通用的场景来回答。
当你用占位符的时候,字符串是不会拼接进语句的。
所以数据库处理的 SQL 语句仍然是
SELECT * FROM table WHERE username = 占位符
然后实际查询时,数据库会用占位符去请求的参数里找,找到 Params[0]的内容,直接拿去做内容比较。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/352449

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX