【发布时间】:2017-03-03 21:50:59
【问题描述】:
是否存在防止mybatis 再次发生 SQL 注入的好方法?
我正在使用它来连接spring-boot。实际上,我使用的是用户在查询中给出的字符串参数。
有任何想法吗?
【问题讨论】:
-
你能粘贴你到目前为止尝试过的示例代码吗?你在为 mybatis 使用映射的 XML 文件吗?
-
是的,XML 文件。
是否存在防止mybatis 再次发生 SQL 注入的好方法?
我正在使用它来连接spring-boot。实际上,我使用的是用户在查询中给出的字符串参数。
有任何想法吗?
【问题讨论】:
一般来说,您应该考虑使用#{} 代替${} 进行字符串替换。
这是因为#{} 导致Mybatis 创建一个preparedStatement 来阻止SQLInjection,而${} 则会将未修改的字符串注入SQL。
Mybatis 在其文档here 中清楚地解释了相同的内容。 (字符串替换部分)
你也可以参考这个blog,它提供了使用mybatis进行字符串替换以及如何停止SQLInjection的示例。
【讨论】:
#{x} x 是字符串,我得到一个错误。在$ {x}的情况下没有这个错误
@Bandi Kishore 是绝对正确的,为了补充他的回答,我认为有必要解释一下准备好的语句本质上阻止 SQLInjection 的原因,正如 article 中所解释的那样
基本上,SQL 服务器引擎会编译您的查询字符串,然后替换它的参数。
使用字符串替换查询: 如果您传递的查询字符串已替换参数,则编译后的查询代码将包含编译为有效 SQL 命令的恶意代码。
使用占位符查询: 另一方面,如果查询字符串只有占位符,则 SQL 服务器引擎将首先使用占位符编译代码,然后它将用提供的值替换占位符(此时插入恶意代码),因为恶意代码未经编译,SQL Server引擎会将其视为纯数据,从而阻止了恶意攻击。
【讨论】: