【问题标题】:Mybatis - preventing agains SQL Injection in LIKE queryMybatis - 防止 LIKE 查询中的 SQL 注入
【发布时间】:2017-07-24 19:48:33
【问题描述】:

我正在使用sql server。让我们看看mybatis 中的以下查询:
param 是字符串类型,数据库中SomeColumnVARCHAR 的类型

...
 = SomeColumn LIKE '%#{param, jdbcType=VARCHAR}%'  

返回错误:

org.mybatis.spring.MyBatisSystemException: 嵌套异常是 org.apache.ibatis.type.TypeException:无法设置参数 映射:ParameterMapping{property='param', mode=IN, javaType=class java.lang.Object, jdbcType=VARCHAR, numericScale=null, resultMapId='null',jdbcTypeName='null',表达式='null'}。原因: org.apache.ibatis.type.TypeException:错误设置非空 参数 #1 与 JdbcType null 。尝试为 此参数或不同的配置属性。原因: org.apache.ibatis.type.TypeException:错误设置非空 参数 #1 与 JdbcType VARCHAR 。尝试为 此参数或不同的配置属性。原因: com.microsoft.sqlserver.jdbc.SQLServerException:索引 1 超出 范围。

我无法处理它(有什么想法吗?),但我发现了一些东西:

...    
<bind name="param" value="'%' + param + '%'" />
...
     = SomeColumn LIKE #{param}    

它确实有效。我认为这会阻止我再次 SQL Injection 但我不确定。你能回答吗? SQL Injection 安全吗?

【问题讨论】:

  • 您需要先转义参数中的所有%,然后再将您想要的参数连接到开头和结尾。例如:stackoverflow.com/questions/8247970/…
  • 好的,但是请告诉我我使用bind 的方法是否是 SQLInjection 安全的?
  • 你能告诉我如何以你的方式逃避它吗?这个例子对我没有帮助
  • 我最近学会了另一种方法:LIKE '%'+#{param}+'%',不需要在参数中转义%。关于注入:只要param值不与查询串联(然后解析执行),而是绑定为参数,应该没问题。
  • @blackwizard 你的方式对我有用。简单地说,数据库引擎在使用 LIKE 过滤器之前会计算 evalues 表达式。我的解决方案对我来说不是很清楚:&lt;bind name="param" value="'%' + param + '%'" /&gt;。据它所知,value="'%' + param + '%'" 中的param 指的是外部变量?

标签: java sql sql-server mybatis


【解决方案1】:

我们遇到了同样的问题,下面的方法对我们有用:

例如 select * from TABLE1 where COLUMN1 like '%' || #{PARAM_NAME} || '%';

这可以防止 SQL 注入并允许在 LIKE 查询中使用 #。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-21
    相关资源
    最近更新 更多