具有主機變量的靜態語句不容易受到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語句的非參數化查詢不安全。
要理解的關鍵是在變量的運行時間值發揮作用之前,語句必須事先編譯(準備好)。在你最初的靜態語句中,語句是在編譯時自動準備的。
注意,由於靜態語句是在編譯時準備的,因此它比在運行時準備的動態語句更好。因此,儘可能使用靜態語句通常是最好的。
非常感謝。只是要更加確定 - :x,:y和:z會是動態的,因爲它們來自用戶輸入。所以只想檢查一下主機變量中的值是否會影響查詢,例如通過包含引號和註釋字符。 – user3374881
否 - 動態SQL是在將字符串傳遞給數據庫之前連接字符串的位置。如果_those_連接的字符串包含用戶輸入,那麼就搞砸了。 (好吧,有一些「安全」類型或方式可以引用其他類型,但通常使用參數/主機變量會更好/更容易)。 –