我需要在 MyBatis 中使用字符串替换来保护(自动)请求 ${myValue)
.
据我所知,替换是在 GenericTokenParser
中自动完成的。使用 TokenHandler.handleToken
的类方法。
我找不到任何关于获取这些值(value)观的信息。 我可以使用
访问PreparedStatement 参数sqlSession.getConfiguration().getMappedStatement(statement).getBoundSql(parameter).getParameterMappings()
但我确实需要检索${}
在发送请求之前修改参数,以便能够在需要时修改值以防止 SQL 注入(inject)。
我考虑使用 AspectJ 来拦截 TokenHandler.handleToken
方法。但我真的更希望能够注入(inject)我自己的处理程序或 token 解析器。
有人知道吗?
<小时/>我正在为 future 的发展制定一个“框架”,目标是实现自动化。遍历整个参数对象不是一个选项(可能很重),我们只想在执行请求之前保护请求中使用的参数。
最佳答案
MyBatis 有 2 种替换方法。 ${}
方法会直接进行字符串替换(即属性替换),因此很容易受到 SQL 注入(inject)的攻击。 #{}
方法对 PreparedStatement
进行参数替换,因此它不易受到攻击。
您确定要使用${}
吗?除非您动态构建 SQL 语句,否则您可能需要使用 #{}
。如果您正在构建动态 SQL,那么您应该在加载 MyBatis 配置之前验证参数。
关于java - MyBatis 保护字符串替换参数免受 sql 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24201209/