【发布时间】:2017-07-24 19:48:33
【问题描述】:
我正在使用sql server。让我们看看mybatis 中的以下查询:param 是字符串类型,数据库中SomeColumn 是VARCHAR 的类型
...
= 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 表达式。我的解决方案对我来说不是很清楚:
<bind name="param" value="'%' + param + '%'" />。据它所知,value="'%' + param + '%'"中的param指的是外部变量?
标签: java sql sql-server mybatis