sql injection

如何防止SQL injection:Statement 和 PreparedStatement

黃佳紳 2019/11/20 18:10:47
3083

什麼是SQL injection:

Sql Injection 應該可以說是目前網路上,駭客最常用的攻擊方式,因為攻擊方式簡單,又不需要使用任何軟體,或是自行撰寫程式,在輸入的字串之中夾帶SQL指令,在設計不良的程式當中忽略了檢查,那麼這些夾帶進去的指令就會被資料庫伺服器誤認為是正常的SQL指令而執行,因此遭到破壞。

攻擊方式:

某個網站的登入驗證的SQL查詢代碼為

strSQL = "SELECT * FROM users WHERE (name = '" + userName + "') and (pw = '"+ passWord +"');"

惡意填入

userName = "' OR '1'='1";

passWord = "' OR '1'='1";

時,將導致原本的SQL字串被填為

strSQL = "SELECT * FROM users WHERE (name = '' OR '1'='1') and (pw = '' OR '1'='1');"

也就是實際上執行的SQL命令會變成下面這樣的

strSQL = "SELECT * FROM users;"

PreparedStatement

PreparedStatement 代表一個可以被執行多的預先編輯的 SQL statement 不用每次執行都要再編輯一次 

安全的使用方式:

藉由使用 PrepareStatement 類別及綁定變數和相應的setString方法sql injection 可以被簡單的防堵

不安全的使用方式:

範例1:

以上程式碼無法有效防堵SQL injection,惡意程式可以被加進程式裡造成SQL injection

範例2:

以上的程式也無法有效的防堵SQL injection,即使使用了PreparedStatement類別

黃佳紳