PHP代碼安全和XSS,SQL注入等對于各類網站的安全非常中用,尤其是UGC(User Generated Content)網站,論壇和電子商務網站,常常是XSS和SQL注入的重災區。這里簡單介紹一些基本編程要點, 相對系統安全來說,php安全防范更多要求編程人員對用戶輸入的各種參數能更細心.
php編譯過程中的安全
建議安裝Suhosin補丁,必裝安全補丁
php.ini安全設置
復制代碼 代碼如下:
register_global = off
magic_quotes_gpc = off
display_error = off
log_error = on
# allow_url_fopen = off
expose_php = off
open_basedir =
safe_mode = on
disable_function = exec,system,passthru,shell_exec,escapeshellarg,escapeshellcmd,proc_close,proc_open,dl,popen,show_source,get_cfg_var
safe_mode_include_dir =
用戶輸入的處理
無需保留HTML標簽的可以用以下方法
strip_tags, 刪除string中所有html標簽
htmlspecialchars,只對”<”,”>”,”;”,”'”字符進行轉義
htmlentities,對所有html進行轉義
必須保留HTML標簽情況下可以考慮以下工具:
復制代碼 代碼如下:
HTML Purifier: HTML Purifier is a standards-compliant HTML filter library written in PHP.
PHP HTML Sanitizer: Remove unsafe tags and attributes from HTML code
htmLawed: PHP code to purify & filter HTML
上傳文件
用is_uploaded_file和move_uploaded_file函數,使用HTTP_POST_FILES[]數組。并通過去掉上傳目錄的PHP解釋功能來防止用戶上傳php腳本。
ZF框架下可以考慮使用File_upload模塊
Session,Cookie和Form的安全處理
不要依賴Cookie進行核心驗證,重要信息需要加密, Form Post之前對傳輸數據進行哈希, 例如你發出去的form元素如下:
復制代碼 代碼如下:
<input type="hidden" value="<?php echo $Oname?>"/> <input type="hidden" value="<?php echo $Oage?>"/> <?php $sign = md5('name'.$Oname.'age'.$Oage.$secret); ?> <input type="hidden" value="<?php echo $sign?>"" />
POST回來之后對參數進行驗證
$str = "";
foreach($_POST['H'] as $key=>$value) {
$str .= $key.$value;
}
if($_POST['hash'] != md5($str.$secret)) {
echo "Hidden form data modified"; exit;
}
安裝/使用方法:
apt-get install libtidy-0.99-0 python-ctypes python-utidylib
python wapiti.py Website URL/ -m GET_XSS
Pixy: XSS and SQLI Scanner for PHP( Pixy - PHP 源碼缺陷分析工具)
安裝: apt-get install default-jdk
新聞熱點
疑難解答