参数化Java JPA ALTER会话SQL

参数化Java JPA ALTER会话SQL,java,sql,jpa,code-injection,fortify,Java,Sql,Jpa,Code Injection,Fortify,我在从JPAEntityManager创建的SQLQuery语句中设置参数时遇到问题。 我在EJB中工作,会话的EntityManager对象有效 import javax.persistence.EntityManager; import javax.persistence.Query; pubic void methodWorks(EntityManager em, String schema) { String sqlStmt = "ALTER SESSION SET

我在从JPA
EntityManager
创建的SQL
Query
语句中设置参数时遇到问题。 我在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();
    }
}
问题是强化扫描(必须通过该扫描)将
methodWorks
方法中的
sqlStmt
标识为易受SQL注入攻击(来自强化)。失败的方法都会报告

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]
仅仅清理输入参数“不够好”,无法通过强化和QA。
将其设置为参数(提示:很容易被愚弄)将通过强化扫描和QA要求。

此查询确实对SQL注入开放,因为您使用的是字符串连接。 处理此类查询的安全方法是使用参数

String sqlStmt = "ALTER SESSION SET CURRENT_SCHEMA = ?";
Query updateQuery = em.createNativeQuery(sqlStmt);

updateQuery.setParameter(0, schema);
updateQuery.executeUpdate();
参数值会自动为您转义。这节省了您的时间,因为您不再需要担心SQL注入。这在Query/EntityManager类中解决。
此外,它使查询更易于阅读。

此查询确实对SQL注入开放,因为您使用的是字符串连接。 处理此类查询的安全方法是使用参数

String sqlStmt = "ALTER SESSION SET CURRENT_SCHEMA = ?";
Query updateQuery = em.createNativeQuery(sqlStmt);

updateQuery.setParameter(0, schema);
updateQuery.executeUpdate();
参数值会自动为您转义。这节省了您的时间,因为您不再需要担心SQL注入。这在Query/EntityManager类中解决。
此外,它使查询更易于阅读。

Ok。感谢您的回答,但这几乎是
方法失败1
。此外,我最初尝试(我认为是正确的)一个基于0的参数列表。这会引发一个例外。然而,经过长时间的搜索,我终于找到了“…语句“alter session set current_schema=schema”以切换对象可见性。。。是DDL语句,不支持绑定变量占位符。。。因此,我现在正在寻找一种方法,使Fortify可以忽略SQL插入漏洞。感谢您的回答,但这几乎是
方法失败1
。此外,我最初尝试(我认为是正确的)一个基于0的参数列表。这会引发一个例外。然而,经过长时间的搜索后,我找到了“…语句‘alter session set current_schema=schema’来切换对象可见性…是一个DDL语句,不支持绑定变量占位符…因此我现在正在寻找一种方法,使Fortify可以忽略SQL插入漏洞。