關於資安防護
Temperature: 0 °C
一直以來我都不敢寫跟資安有關的文章..對我來說...資安一直是一個課題..XSS...CSRF...SQL Injection....
而我也不是這方面的專家...這次只當是將自己的作法紀錄下來提醒自己注意...
這3天接到了一個專案任務...朋友客戶的網站系統出現資安漏洞...
以往在解決資安問題時...每次都會讓我苦腦很久...不知為什麼就是會有幾個地方抓很久抓不到...@@
接著就是解決方式了...
首先我得先把客戶的網站系統用FTP抓下來...想說就連著讓他抓...怎知一直抓都抓不完全..還會被我的防毒軟體發出警告...
原來這網站系統已經不是有資安漏洞而已...而是程式碼早已被竄改並植入後門...
不得已只好關了防毒軟體把檔案抓下來..一支一支先清除被植入的code...
然後再架設在虛擬空間..開始修補大工程...
白話來說..會產生資安漏洞的疑慮就是操作端在對server端發出請求時..被植入不該有的程式碼..
造成資料庫資料被竊取...又或者造成資料庫資料被竄改...甚至整個網站server癱瘓...這是非常嚴重的問題..
因此我們必須在操作端發出請求時....接收端要接收到完整且沒被竄改也沒被植入特殊符號的value
那麼我的做法會有以下幾種:
若使用 $_SERVER["REQUEST_URI"]取得當前頁面時
應該改成 htmlEntities($_SERVER['REQUEST_URI'], ENT_QUOTES, "UTF-8") 取得當前頁面
過濾字串方面
若使用$_GET $_POST $_REQUEST接收請求時應該要過濾特殊字元或符號
使用 mysql_escape_string 或 htmlspecialchars
mysql_real_escape_string()函數轉義SQL語句中使用的字符串中的特殊字符。
使用方式為mysql_real_escape_string($value)
用htmlspecialchars()函數把一些預定義的字符轉換為HTML實體。
& (和號) 成為 &
" (雙引號) 成為 "
' (單引號) 成為 '
< (小於) 成為 <
> (大於) 成為 >
使用方式為htmlspecialchars(string,quotestyle,character-set)
替代字串方面
列出可能會有問題的一些字串符號
$search=array("-","(",")","~","'","or","and","OR","=","execute","update","count","chr","mid","master","truncate","char","declare","select","create","delete","insert","%20");
把這些可能會有問題的一些字串符號替換成什麼內容?...這邊我是全都替換成空值...
$replace=array("","","","","","","","","","","","","","","","","","","","","","","");
$search 跟 $replace 陣列數需相對應..接著以下
$value=str_replace($search, $replace,htmlspecialchars($value));
完成替換..過濾掉有問題的符號...
請求查詢資料庫方面..使用參數化查詢...這邊用的是擬參數化查詢..也能有成效
將原本的查詢方式 $sql="select * FROM table where id='$value'"
改成 $sql=sprintf("select * FROM table where id='%s'",mysql_real_escape_string($value));
如果是查相似值
將原本的查詢方式 $sql="select * FROM table where id LIKE '%$value%'"
改成 $sql=sprintf("select * FROM table where id LIKE '%%%s%%'",mysql_real_escape_string($value));
Apache設定方面
將 AcceptPathInfo 設為 off
最後我用Acunetix Web Vulnerability Scanner 9.5 來做弱點掃瞄..確認已修補
當然...解決的方法有很多....重點就是不要讓操作端植入可以執行的程式碼......
資安一直是一個課題...