資訊安全基礎
作為SQL隱碼攻擊的對策,使用預留位置的參數化查詢(prepared statement),被視為比去除輸入中危險字元的方法更根本的對策。理由是什麼?
- A把輸入加密後再傳給資料庫,因此攻擊者無法讀取內容
- B在瀏覽器端檢查輸入的字元種類,因此不當的字串不會送到伺服器
- C先確定SQL敘述的結構,之後只把輸入當作值傳入,因此無論輸入包含什麼字元,都不會被解讀為命令的一部分
查看答案與解析
正確答案:C. 先確定SQL敘述的結構,之後只把輸入當作值傳入,因此無論輸入包含什麼字元,都不會被解讀為命令的一部分
使用參數化查詢時,先把值的部分以符號(預留位置)表示的SQL敘述,例如「SELECT … WHERE id = ? AND password = ?」,交給資料庫確定其結構,之後再把輸入只當作值結合進去(繫結)。輸入自始至終都被當作資料處理,即使包含引號,也不會成為附加條件之類的命令的一部分。去除或跳脫危險字元的方法,必須毫無遺漏地處理各種資料庫與字元編碼的細部規則,只要有一處遺漏,攻擊就會成功。此外,在瀏覽器端檢查輸入,只要攻擊者不經瀏覽器直接送出請求就能繞過,因此只是為了便利,並不是安全對策。再加上把連接資料庫的帳號權限設為最小,就能縮小損害。
- A. 參數化查詢並不會加密輸入。重點在於把值與SQL敘述的結構分開處理。
- B. 瀏覽器端的檢查只要直接送出請求就能繞過,因此不能算是對策。
- C. 正確。先固定敘述的結構,輸入只當作值處理,因此不會被解讀為命令。