问题描述
我在从JPA Query
创建的sql EntityManager
语句中设置参数时遇到问题。
我正在使用EJB,并且该会话的EntityManager
对象有效。
import javax.persistence.EntityManager;
import javax.persistence.Query;
pubic void methodWorks(EntityManager em,String schema) {
String sqlStmt = "ALTER SESSION SET CURRENT_SCHEMA = " + schema;
try {
em.createNativeQuery(sqlStmt).executeUpdate();
}
catch(Exception ex) {
ex.printstacktrace();
}
}
pubic void methodFails1(EntityManager em,String schema) {
String sqlStmt = "ALTER SESSION SET CURRENT_SCHEMA = ?";
try {
em.createNativeQuery(sqlStmt).setParameter(1,schema).executeUpdate();
}
catch(Exception ex) {
ex.printstacktrace();
}
}
pubic void methodFails2(EntityManager em,String schema) {
String sqlStmt = "ALTER SESSION SET CURRENT_SCHEMA = ?1";
try {
em.createNativeQuery(sqlStmt).setParameter(1,schema).executeUpdate();
}
catch(Exception ex) {
ex.printstacktrace();
}
}
pubic void methodFails3(EntityManager em,String schema) {
String sqlStmt = "ALTER SESSION SET CURRENT_SCHEMA = :inputSchema";
try {
em.createNativeQuery(sqlStmt).setParameter("inputSchema",schema).executeUpdate();
}
catch(Exception ex) {
ex.printstacktrace();
}
}
问题是,Fortify扫描(必须通过 )将sqlStmt
方法中的methodWorks
识别为容易受到sql注入攻击的攻击(来自Fortify) 。失败的方法全部报告
Internal Exception java.sql.sqlSyntaxErrorException: ORA:-02421 mission or invalid schema authorization identifier.
Error Code 2421
Call: ALTER SESSION SET CURRENT_SCHEMA = ?
bind => [1 parameter bound]
仅清理输入参数“不够好”以通过Fortify和QA。 将其设置为参数(提示:可以很容易上当)将通过Fortify扫描和质量检查要求。
解决方法
此查询确实对SQL注入开放,因为您使用的是字符串连接。 处理此类查询的安全方法是使用参数。
String sqlStmt = "ALTER SESSION SET CURRENT_SCHEMA = ?";
Query updateQuery = em.createNativeQuery(sqlStmt);
updateQuery.setParameter(0,schema);
updateQuery.executeUpdate();
将自动为您转义参数值。这样就节省了时间,因为您不再需要担心SQL注入。这在Query / EntityManager类中解决。 而且,它使查询更易于阅读。