2014-03-03 122 views
2

我正在調查一些COBOL代碼中可能的SQL注入漏洞。該代碼使用主機變量將語句提交給DB2數據庫。例如COBOL/DB2 SQL注入

EXEC SQL INSERT INTO TBL (a, b, c) VALUES (:x, :y, :z) END-EXEC 

誰能告訴我,如果這個方法是容易受到攻擊SQLI或者如果方式COBOL/DB2解析主機變量意味着,這將是不可能的執行?

我讀到的每件事情都表明,有更好的方法來防範SQLi,但IBM網站確實提到了使用主機變量,但沒有說明它是否會完全緩解攻擊。

回答

4

具有主機變量的靜態語句不容易受到SQL注入攻擊。

非參數化動態語句,你需要擔心...... 他們會看起來像等什麼:(我的COBOL生鏽)

STRING "INSERT INTO TBL (a,b,c) VALUES (" 
     X ", " 
     Y ", " 
     Z ")" INTO WSQLSTMT. 

EXEC SQL PREPARE MYSTMT FROM :WSQLSTMT END-EXEC. 
EXEC SQL EXECUTE MYSTMT END-EXEC. 

注意,你可以使用EXECUTE IMMEDIATE,到位兩個步驟的PREPARE和EXECUTE

與此相反,一個參數化的動態查詢看起來像:

STRING "INSERT INTO TBL (a,b,c) VALUES (?, ?, ?)" INTO WSQLSTMT. 
EXEC SQL PREPARE MYSTMT FROM :WSQLSTMT END-EXEC. 
EXEC SQL EXECUTE MYSTMT USING :X, :Y, :Z END-EXEC. 

總之,爲static使用像你這樣的主機變量進行查詢的原始發佈是安全的,因爲它是一個參數化的動態查詢。直接使用用戶輸入構建要執行的SQL語句的非參數化查詢不安全。

要理解的關鍵是在變量的運行時間值發揮作用之前,語句必須事先編譯(準備好)。在你最初的靜態語句中,語句是在編譯時自動準備的。

注意,由於靜態語句是在編譯時準備的,因此它比在運行時準備的動態語句更好。因此,儘可能使用靜態語句通常是最好的。

+0

非常感謝。只是要更加確定 - :x,:y和:z會是動態的,因爲它們來自用戶輸入。所以只想檢查一下主機變量中的值是否會影響查詢,例如通過包含引號和註釋字符。 – user3374881

+1

否 - 動態SQL是在將字符串傳遞給數據庫之前連接字符串的位置。如果_those_連接的字符串包含用戶輸入,那麼就搞砸了。 (好吧,有一些「安全」類型或方式可以引用其他類型,但通常使用參數/主機變量會更好/更容易)。 –