我需要在MyBatis ${myValue)
中使用字符串替换来保护(自动)请求。
从我看到的情况来看,替换是使用GenericTokenParser
方法在TokenHandler.handleToken
类中自动完成的。
我找不到任何关于获取这些值的信息。 我可以使用
访问PreparedStatement参数sqlSession.getConfiguration().getMappedStatement(statement).getBoundSql(parameter).getParameterMappings()
但是我真的需要在发送请求之前检索${}
参数,以便在需要时修改值以防止SQL注入。
我虽然使用AspectJ来拦截TokenHandler.handleToken
方法。但我真的更愿意能够注入我自己的处理程序或令牌解析器。
有人知道吗?
我正在为未来的发展制定一个“框架”,目的是让事情自动化。遍历整个参数对象不是一个选项(可能很重),我们只想在执行它之前保护请求中使用的那些。
答案 0 :(得分:3)
MyBatis有2种替代方法。 ${}
方法确实指示字符串替换(即属性替换),因此它易受SQL注入攻击。 #{}
方法在PreparedStatement
上执行参数替换,因此不易受攻击。
您确定要使用${}
吗?除非您动态构建SQL语句,否则您可能希望使用#{}
。如果要构建动态SQL,则应在加载MyBatis配置之前验证参数。