参数化Java JPA ALTER SESSION SQL

问题描述

我在从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类中解决。 而且,它使查询更易于阅读。