首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >即使在使用jpa命名参数之后也进行SQL注入

即使在使用jpa命名参数之后也进行SQL注入
EN

Stack Overflow用户
提问于 2022-09-05 09:02:55
回答 2查看 105关注 0票数 0

我的JPA方法看起来像

代码语言:javascript
运行
复制
@Query(value="select em from Employee em where em.firstName like %:text% or em.lastName like %:text%")
Employee findBySearchText(String text);

由于我使用的是命名参数,因此不会有任何SQL注入的风险。

但是在checkmarx工具中,它被标记为一个高漏洞,建议使用OWASP库对输入进行净化。

还有别的办法来解决这个问题吗。

EN

回答 2

Stack Overflow用户

发布于 2022-09-07 08:01:47

参数值被绑定为JDBC参数,因此这里不可能有SQL注入。您可能想要净化的唯一东西是特殊的通配符?%。为此,可以在参数值中使用转义字符指定转义字符和前缀特殊字符。

您可以使用这样的东西,这是安全的,也是更正确的(您原来的HQL可能只是偶然地起作用):

代码语言:javascript
运行
复制
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);
票数 0
EN

Stack Overflow用户

发布于 2022-09-06 03:32:05

在将文本发送到数据库之前进行一些验证。

如果不能访问数据库,

SQL注入就不能注入SQL -- Barack,大约2014年

名字通常没有分号;。如果文本包含它,则拒绝它并显示错误消息。

/\也是如此。名字通常不包含这个。名字通常也没有+符号。这些都是最常见的东西,可以用来注射。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73606928

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档