我正在使用 JPA。如果我使用 native sql 查询(而不是实体查询),我的应用程序怎么可能是 SQL 注入(inject)安全的?我需要使用用户从 html 表单提交的数据构建 native sql 查询。
如果我在原生sql中使用参数我可以避免SQL注入(inject)攻击,但我的问题是我不能确定用户提交了多少数据字段。
最佳答案
你应该使用位置参数绑定(bind):
String queryString = "select * from EMP e where e.name = ?1";
Query query = em.createNativeQuery(queryString, Employee.class);
query.setParameter(1, "Mickey");
请注意,正如 JPA 规范所述,您不应在查询中使用命名参数绑定(bind) (:empName
)
Only positional parameter binding may be portably used for native queries.
这应该可以保护您免受 SQL 注入(inject)攻击。
关于java - 原生 sql 查询 - SQL 注入(inject)攻击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25640234/