我的JPA方法看起来像
@Query(value="select em from Employee em where em.firstName like %:text% or em.lastName like %:text%")
Employee findBySearchText(String text);
由于我使用的是命名参数,因此不会有任何SQL注入的风险。
但是在checkmarx工具中,它被标记为一个高漏洞,建议使用OWASP库对输入进行净化。
还有别的办法来解决这个问题吗。
发布于 2022-09-07 08:01:47
参数值被绑定为JDBC参数,因此这里不可能有SQL注入。您可能想要净化的唯一东西是特殊的通配符?
和%
。为此,可以在参数值中使用转义字符指定转义字符和前缀特殊字符。
您可以使用这样的东西,这是安全的,也是更正确的(您原来的HQL可能只是偶然地起作用):
default Employee findBySearchText(String text) {
if (text == null || text.isBlank()) return null;
String pattern = "%" + text.replace("\\", "\\\\").replace("?", "\\?").replace("%", "\\%") + "%";
return findBySearchTextInternal(pattern);
}
@Query(value="select em from Employee em where em.firstName like :text escape '\' or em.lastName like :text escape '\'")
Employee findBySearchTextInternal(String text);
发布于 2022-09-06 03:32:05
在将文本发送到数据库之前进行一些验证。
如果不能访问数据库,
SQL注入就不能注入SQL -- Barack,大约2014年
名字通常没有分号;
。如果文本包含它,则拒绝它并显示错误消息。
/
或\
也是如此。名字通常不包含这个。名字通常也没有+
符号。这些都是最常见的东西,可以用来注射。
https://stackoverflow.com/questions/73606928
复制相似问题