位置:首頁 > 數據庫 > SQLite教學 > SQLite INJECTION/注入

SQLite INJECTION/注入

如果用戶通過網頁輸入,並將其插入到一個SQLite數據庫中,有一個機會,已經離開自己敞開的一個被稱為SQL注入的安全問題。這一課將教你如何幫助防止這種情況的發生,並幫助保護腳本和SQLite語句。

注入通常發生在需求用戶輸入,就像他們的名字,而不是一個名字,他們給一個SQLite語句,會在不知不覺中數據庫上運行。

永遠不要相信用戶提供的數據,僅處理這些數據驗證後,作為一項規則,這是通過模式匹配。在下麵的例子中,用戶名被限製為字母數字字符加下劃線和8到20個字符之間的長度 - 需要修改這些規則。

if (preg_match("/^w{8,20}$/", $_GET['username'], $matches)){
   $db = new SQLiteDatabase('filename');
   $result = @$db->query("SELECT * FROM users WHERE username=$matches[0]");
}else{
   echo "username not accepted";
}

為了證明問題,可以考慮此摘錄:

$name = "Qadir'; DELETE FROM users;";
@$db->query("SELECT * FROM users WHERE username='{$name}'");

函數調用應該從用戶表“名稱”列中由用戶指定的名稱相匹配的檢索記錄。正常情況下,名稱將隻包含字母數字字符,或許空間,如字符串ilia。但在這裡,通過追加一個全新的$name查詢,調用數據庫變成災難:注入的DELETE查詢刪除用戶的所有記錄。

有不允許查詢堆疊或一個函數調用執行多個查詢的數據庫接口。如果嘗試到堆疊查詢調用失敗,但SQLite和PostgreSQL裡仍進行堆查詢,執行在一個字符串中所有提供的查詢,並創建一個嚴重的安全問題。

防止SQL注入:

可以巧妙地處理所有的轉義字符,像Perl和PHP腳本語言。編程語言PHP提供了函數字符串sqlite_escape_string()來轉義輸入的字符是特殊的SQLite字符。

if (get_magic_quotes_gpc()) 
{
  $name = sqlite_escape_string($name);
}
$result = @$db->query("SELECT * FROM users WHERE username='{$name}'");

雖然編碼使得它的安全插入數據,它會呈現簡單的文本比較LIKE 子句在查詢不能包含二進製數據的列。

請注意,addslashes()不應該被用來引用SQLite 查詢字符串,檢索數據時,它會導致奇怪的結果。