V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
esolve
V2EX  ›  问与答

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

  •  
  •   esolve · 2017-04-04 16:13:50 +08:00 · 2133 次点击
    这是一个创建于 2790 天前的主题,其中的信息可能已经有所发展或是发生改变。
    5 条回复    2017-04-05 03:40:44 +08:00
    ixiaozhi
        1
    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
        2
    zacharyjia  
       2017-04-04 16:39:36 +08:00
    @ixiaozhi 我猜 lz 是在问 $ 和 # 的区别
    ixiaohei
        3
    ixiaohei  
       2017-04-04 17:06:07 +08:00
    $是静态替换,相当于最后替换字符串。#是动态的,原理是 prepearStatement 占位符。应该是 JDBC 驱动做的转换,比较安全,推荐方式。但是很多场景 prepearStatement 处理不了,我记得替换表名应该是处理不了要用$,其他的用#。具体可以 mybatis 源代码,做了两步转换的。第一步静态替换就是处理$。第二部处理#.
    esolve
        4
    esolve  
    OP
       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
        5
    msg7086  
       2017-04-05 03:40:44 +08:00
    @esolve 我没用过 Mybatis ,只从通用的场景来回答。
    当你用占位符的时候,字符串是不会拼接进语句的。
    所以数据库处理的 SQL 语句仍然是
    SELECT * FROM table WHERE username = 占位符
    然后实际查询时,数据库会用占位符去请求的参数里找,找到 Params[0]的内容,直接拿去做内容比较。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1076 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 18:50 · PVG 02:50 · LAX 10:50 · JFK 13:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.