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 查詢字符串,檢索數據時,它會導致奇怪的結果。