反恐精英之動態SQL和SQL隱碼攻擊-SQL隱碼攻擊-防衛SQL隱碼攻擊-顯式格式化模型

LuiseDalian發表於2014-02-16

如果使用日期或數值連線到SQLPL/SQL的文字中,並且不能使用繫結變數來傳遞它們,

則可以使用顯式的格式化模型來把它們轉換成文字,這是獨立於執行的會話的NLS引數設定的。

可以確保轉換後的值具有日期或數字的字面量的格式。

 

建議使用顯式的獨立於本地的格式化模型來構造SQL語句,不僅僅是出於安全的考慮,

也可以確保動態SQL語句可以在任何全域性環境中正常執行。

--11g12_07_14.prc,針對11g12_07_11.prc的解決方法

CREATE OR REPLACE PROCEDURE get_recent_record (

    user_name      IN  VARCHAR2,

    service_type  IN  VARCHAR2,

    rec             OUT VARCHAR2)

IS

    query VARCHAR2(4000);

BEGIN   

    query := 'SELECT value FROM secret_records WHERE user_name='''

            || user_name

            || ''' AND service_type='''

            || service_type

            || ''' AND date_created> DATE '''

            || TO_CHAR(SYSDATE - 30,'YYYY-MM-DD')

            || '''';

    DBMS_OUTPUT.PUT_LINE('查詢: ' || query);

    EXECUTE IMMEDIATE query INTO rec;

    DBMS_OUTPUT.PUT_LINE('結果: ' || rec);

END;

-- 11g12_07_14.tst

-- 執行之前先設定會話變數

-- ALTER SESSION SET NLS_DATE_FORMAT='"'' OR service_type=''Merger"';

DECLARE

    record_value VARCHAR2(4000);

BEGIN

    get_recent_record('Anybody', 'Anything', record_value);

END;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/17013648/viewspace-1082077/,如需轉載,請註明出處,否則將追究法律責任。

相關文章