黄色电影一区二区,韩国少妇自慰A片免费看,精品人妻少妇一级毛片免费蜜桃AV按摩师 ,超碰 香蕉

SQLite 注入

sqlite 注入

如果您的站點允許用戶通過網頁輸入,并將輸入內容插入到 sqlite 數據庫中,這個時候您就面臨著一個被稱為 sql 注入的安全問題。本章節(jié)將向您講解如何防止這種情況的發(fā)生,確保腳本和 sqlite 語句的安全。

注入通常在請求用戶輸入時發(fā)生,比如需要用戶輸入姓名,但用戶卻輸入了一個 sqlite 語句,而這語句就會在不知不覺中在數據庫上運行。

永遠不要相信用戶提供的數據,所以只處理通過驗證的數據,這項規(guī)則是通過模式匹配來完成的。在下面的范例中,用戶名 username 被限制為字母數字字符或者下劃線,長度必須在 8 到 20 個字符之間 - 請根據需要修改這些規(guī)則。

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 的所有記錄。

雖然已經存在有不允許查詢堆疊或在單個函數調用中執(zhí)行多個查詢的數據庫接口,如果嘗試堆疊查詢,則會調用失敗,但 sqlite 和 postgresql 里仍進行堆疊查詢,即執(zhí)行在一個字符串中提供的所有查詢,這會導致嚴重的安全問題。

 

1. 防止 sql 注入

在腳本語言中,比如 perl 和 php,您可以巧妙地處理所有的轉義字符。編程語言 php 提供了字符串函數 sqlite3::escapestring($string) 和 sqlite_escape_string() 來轉義對于 sqlite 來說比較特殊的輸入字符。

注意:使用函數 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}'");

雖然編碼使得插入數據變得安全,但是它會呈現(xiàn)簡單的文本比較,在查詢中,對于包含二進制數據的列,like 子句是不可用的。

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

下一節(jié):sqlite explain

sqlite教程

相關文章