MyBatis保护sql注入的String Substitution参数

时间:2014-06-13 08:46:01

标签: java sql sql-injection mybatis ibatis

我需要在MyBatis ${myValue)中使用字符串替换来保护(自动)请求。

从我看到的情况来看,替换是使用GenericTokenParser方法在TokenHandler.handleToken类中自动完成的。

我找不到任何关于获取这些值的信息。 我可以使用

访问PreparedStatement参数
sqlSession.getConfiguration().getMappedStatement(statement).getBoundSql(parameter).getParameterMappings()

但是我真的需要在发送请求之前检索${}参数,以便在需要时修改值以防止SQL注入。

我虽然使用AspectJ来拦截TokenHandler.handleToken方法。但我真的更愿意能够注入我自己的处理程序或令牌解析器。

有人知道吗?


我正在为未来的发展制定一个“框架”,目的是让事情自动化。遍历整个参数对象不是一个选项(可能很重),我们只想在执行它之前保护请求中使用的那些。

1 个答案:

答案 0 :(得分:3)

MyBatis有2种替代方法。 ${}方法确实指示字符串替换(即属性替换),因此它易受SQL注入攻击。 #{}方法在PreparedStatement上执行参数替换,因此易受攻击。

您确定要使用${}吗?除非您动态构建SQL语句,否则您可能希望使用#{}。如果要构建动态SQL,则应在加载MyBatis配置之前验证参数。