Собственный SQL Запрос к JPQL & SQL Предотвращение атак инъекций - PullRequest
0 голосов
/ 07 февраля 2020

Меня попросили преобразовать следующий собственный SQL запрос в JPQL.

SELECT
        * 
    FROM
        (SELECT
            CUSTOMER_NAME,
            CUSTOMER_ID,
            CUSTOMER_KEY,
            CUST_F_REF,
            UV_ID,
            IRC_SRC,
            -------
            -------          
            PRECEDING_CUSTOMER_KEY 
        FROM
            (  SELECT
                CD.*,
                CASE 
                    WHEN CD.CUSTOMER_KEY=CD.PREC_CUSTOMER_KEY       THEN NULL 
                    ELSE CD.PREC_CUSTOMER_KEY    
                END AS PRECEDING_CUSTOMER_KEY   
            FROM
                (   SELECT
                    CDATA_1.EXEC_DATE AS REFERENCE_DATE,
                    CDATA_2.*,
                    FIRST_VALUE(CDATA_2.CUSTOMER_KEY) OVER(    PARTITION 
                BY
                    CDATA_2.CUST_F_REF 
                ORDER BY
                    CDATA_2.EXEC_DATE ROWS 1 PRECEDING) AS PREC_CUSTOMER_KEY    
                FROM
                    (    SELECT
                        CUST_F_REF,
                        UV_ID,
                        IRC_SRC,
                        EXEC_DATE 
                    FROM
                        CUTOMER_DWH.QUERY_CUST_DATA_FULL_V SV 
                    WHERE
                        1=1 
                        AND CUSTOMER_KEY=? ) CDATA_1,
                    CUTOMER_DWH.QUERY_CUST_DATA_VCD_V CDATA_2 
                WHERE
                    CDATA_1.CUST_F_REF=CDATA_2.CUST_F_REF 
                    OR (
                        CDATA_1.UV_ID=CDATA_2.UV_ID 
                        AND CDATA_1.CUST_F_REF IS NULL
                    ) 
                    OR (
                        CDATA_1.IRC_SRC=CDATA_2.IRC_SRC 
                        AND CDATA_1.CUST_F_REF IS NULL 
                        AND CDATA_1.UV_ID IS NULL
                    )
                ) CD 
            WHERE
                CD.EXEC_DATE=CD.REFERENCE_DATE 
                AND CUSTOMER_KEY=? )) CDATA 

Это одно из существующих приложений, сделанных очень долго go, поэтому я понятия не имею, каковы фактические ожидаемые выходные данные. Я изучил и понял запрос самостоятельно.

1 = 1 необходимо удалить. Я вставил запрос так, как он существует.

Собственный запрос выполняется следующим образом:

    em.createNativeQuery(query.toString(), QUERY_CUST_DATA_VCD_V.class);
    q.setParameter(1, customerKey);
    q.setParameter(2, customerKey);

После изучения нескольких существующих вопросов (например, this ), Я обнаружил, что невозможно конвертировать этот вложенный выбор в JPQL. Также одной из основных причин запроса этого изменения является защита его от атак уязвимости, поскольку это общедоступное приложение. После ссылки на подобный поток здесь я понял, что текущий собственный запрос безопасен.

  1. Возможно ли преобразовать этот запрос SQL в JPQL / HQL / Criteria любым другие средства?
  2. Защищена ли существующая реализация NativeQuery от уязвимости?

Любые предложения будут очень полезны.

Большое спасибо заранее.

...