【问题标题】:Parameterize Java JPA ALTER SESSION SQL参数化 Java JPA ALTER SESSION SQL
【发布时间】:2020-09-29 13:54:33
【问题描述】:

我在从 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();
    }
}

问题在于 Fortify 扫描(必须通过)将 methodWorks 方法中的 sqlStmt 识别为易受 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 扫描和 QA 要求。

【问题讨论】:

    标签: java sql jpa code-injection fortify


    【解决方案1】:

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

    String sqlStmt = "ALTER SESSION SET CURRENT_SCHEMA = ?";
    Query updateQuery = em.createNativeQuery(sqlStmt);
    
    updateQuery.setParameter(0, schema);
    updateQuery.executeUpdate();
    

    参数值会自动为您转义。这可以节省您的时间,因为您不再需要担心 SQL 注入。这在 Query/EntityManager 类中得到解决。 此外,它使查询更易于阅读。

    【讨论】:

    • 好的。感谢您的回答,但这几乎是methodFails1。此外,我最初尝试(我认为是正确的)基于 0 的参数列表。这会引发该效果的异常。但是,经过长时间的搜索,我能够打开“...statement 'alter session set current_schema=SCHEMA' to switch object visibility...是一个 DDL 语句不是支持绑定变量占位符...所以我现在正在寻找一种方法让 Fortify 忽略 SQL 插入漏洞。
    猜你喜欢
    • 2018-07-01
    • 2011-07-27
    • 2019-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多