【问题标题】:Prevent against SQL Injection - mybatis and spring防止SQL注入——mybatis和spring
【发布时间】:2017-03-03 21:50:59
【问题描述】:

是否存在防止mybatis 再次发生 SQL 注入的好方法?
我正在使用它来连接spring-boot。实际上,我使用的是用户在查询中给出的字符串参数。
有任何想法吗?

【问题讨论】:

  • 你能粘贴你到目前为止尝试过的示例代码吗?你在为 mybatis 使用映射的 XML 文件吗?
  • 是的,XML 文件。

标签: java spring mybatis


【解决方案1】:

一般来说,您应该考虑使用#{} 代替${} 进行字符串替换。

这是因为#{} 导致Mybatis 创建一个preparedStatement 来阻止SQLInjection,而${} 则会将未修改的字符串注入SQL。

Mybatis 在其文档here 中清楚地解释了相同的内容。 (字符串替换部分)

你也可以参考这个blog,它提供了使用mybatis进行字符串替换以及如何停止SQLInjection的示例。

【讨论】:

  • 是的,我考虑了一下。但是,如果#{x} x 是字符串,我得到一个错误。在$ {x}的情况下没有这个错误
  • 这取决于字符串值和查询的编写方式。错误是一件好事,另一方面,没有错误,可能意味着您担心的 SQL 注入是成功的,(因为您的代码任其发展)。
  • @blackwizard “这取决于字符串值和查询的编写方式。”这是什么意思?
【解决方案2】:

@Bandi Kishore 是绝对正确的,为了补充他的回答,我认为有必要解释一下准备好的语句本质上阻止 SQLInjection 的原因,正如 article 中所解释的那样

基本上,SQL 服务器引擎会编译您的查询字符串,然后替换它的参数。

使用字符串替换查询: 如果您传递的查询字符串已替换参数,则编译后的查询代码将包含编译为有效 SQL 命令的恶意代码。

使用占位符查询: 另一方面,如果查询字符串只有占位符,则 SQL 服务器引擎将首先使用占位符编译代码,然后它将用提供的值替换占位符(此时插入恶意代码),因为恶意代码未经编译,SQL Server引擎会将其视为纯数据,从而阻止了恶意攻击。

【讨论】:

    猜你喜欢
    • 2017-07-24
    • 2019-06-03
    • 2011-06-12
    • 1970-01-01
    • 2011-09-27
    • 1970-01-01
    • 2018-03-23
    • 1970-01-01
    相关资源
    最近更新 更多