查了很多,腦袋也有點亂,稍為紀錄一下
僅記一個原則就是"使用者在表單輸入的資料皆不可信"
因此使用者填寫送出的表單一定要先處理過才能丟進網址/資料庫
SQL injection
這比較簡單,因為有危險的字串很固定,所以現在php或者各個框架都有提供解法
mysql_real_escape_string($query_string);
CodeIgniter的Databse Class底下的Active Record Class裡所有方法都會對傳入的字串自動過濾
或者Database class的方法 $this->db->escape($string)
XSS Cross-site scripting
表單→GET到網址列上
先POST到別的函式或網頁,用rawurlencode($input)處理輸入表單後後才放到網址列
字串放入SQL時再用rawurldecode($input)解開
請不要用urlencode() / urldecode() 因為urlencode()會把空格編成'+' 基本上是不同字元了
尤其用在搜尋的話會是錯的
表單←→Database
該表單欄位不允許HTML:
htmlspecialchars($str)可將字串轉成HTML下的純文字 (<>:;等都被轉成普通字串)
html_entity_decode($str)還原成原來的HTML文字
載入DB資料放入表單當預設值(通常用在修改資料功能)可以直接使用htmlspecialchars()處理過的字串不需還原
允許部份HTML
直接套用別人寫好的過濾程式濾掉不安全的標記或Javascript
HTML Purifier
過濾字串可以在資料輸入Database時作,或者從Database載入到網頁時作
我是選擇在料輸入Database時作,因為使用經驗上寫入次數一定是比讀取次數來得少
而且在CodeIgniter下,此時作字串過濾可以幾乎將這些工作交給Model完成
缺點就是使用者輸入的資料可能會因字串過濾而被更動,但我覺得以我目前的專案來說沒差
還有如果有人不是透過網站原來設計的介面寫入資料庫則可繞過所有過濾機制
但如果發生此狀況的話那情況想必比網站被放入XSS來得更嚴重
檔案上傳
一定要先檢查副檔名和header
(CodeIgniter的 File Upload Class有提供過濾機制)
檢查訪問來源網址
$_SERVER['HTTP_REFERER']
用法大概是這樣
if(isset($_SERVER['HTTP_REFERER']) && !ereg('http://www.yoursite.com',$_SERVER['HTTP_REFERER'])){
echo "Illegal access source IP/url, access denied!";
die();
}
不過瀏覽器可以偽造此函數 只能防君子
沒有留言:
張貼留言