導讀 | SQLite 是一個軟件庫,實現了自給自足的、無服務器的、零配置的、事務性的 SQL 數據庫引擎。SQLite 是在世界上最普遍部署的 SQL 數據庫引擎。SQLite 源代碼不受版權限制。 |
SQLite 注入html
若是您的站點容許用戶經過網頁輸入,並將輸入內容插入到 SQLite 數據庫中,這個時候您就面臨着一個被稱爲 SQL 注入的安全問題。本章節將向您講解如何防止這種狀況的發生,確保腳本和 SQLite 語句的安全。linux
注入一般在請求用戶輸入時發生,好比須要用戶輸入姓名,但用戶卻輸入了一個 SQLite 語句,而這語句就會在不知不覺中在數據庫上運行。sql
永遠不要相信用戶提供的數據,因此只處理經過驗證的數據,這項規則是經過模式匹配來完成的。在下面的實例中,用戶名 username 被限制爲字母數字字符或者下劃線,長度必須在 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"; }
爲了演示這個問題,假設考慮此摘錄:To demonstrate the problem, consider this excerpt:編程
$name = "Qadir'; DELETE FROM users;"; @$db->query("SELECT * FROM users WHERE username='{$name}'");
函數調用是爲了從用戶表中檢索 name 列與用戶指定的名稱相匹配的記錄。正常狀況下,$name 只包含字母數字字符或者空格,好比字符串 ilia。但在這裏,向 $name 追加了一個全新的查詢,這個對數據庫的調用將會形成災難性的問題:注入的 DELETE 查詢會刪除 users 的全部記錄。安全
雖然已經存在有不容許查詢堆疊或在單個函數調用中執行多個查詢的數據庫接口,若是嘗試堆疊查詢,則會調用失敗,但 SQLite 和 PostgreSQL 裏仍進行堆疊查詢,即執行在一個字符串中提供的全部查詢,這會致使嚴重的安全問題。服務器
防止 SQL 注入編程語言
在腳本語言中,好比 PERL 和 PHP,您能夠巧妙地處理全部的轉義字符。編程語言 PHP 提供了字符串函數 SQLite3::escapeString($string) 和 sqlite_escape_string() 來轉義對於 SQLite 來講比較特殊的輸入字符。ide
注意:使用函數 sqlite_escape_string() 的 PHP 版本要求爲 PHP 5 < 5.4.0。 更高版本 PHP 5 >= 5.3.0, PHP 7 使用以上函數:函數
SQLite3::escapeString($string);//$string爲要轉義的字符串
如下方式在最新版本的 PHP 中不支持:
if (get_magic_quotes_gpc()) { $name = sqlite_escape_string($name); } $result = @$db->query("SELECT * FROM users WHERE username='{$name}'");
雖然編碼使得插入數據變得安全,可是它會呈現簡單的文本比較,在查詢中,對於包含二進制數據的列,LIKE 子句是不可用的。
請注意,addslashes() 不該該被用在 SQLite 查詢中引用字符串,它會在檢索數據時致使奇怪的結果。Linux就該這麼學