2012年3月2日 星期五

(轉) PHP網站防攻擊 (PHP開發中必須注意的安全防範知識)


系統講解PHP開發中安全防範知識 

PHP代碼安全和XSSSQL注入等對於各類網站的安全非常中用,尤其是UGC(User Generated Content)網站,論壇和電子商務網站,常常是XSSSQL注入的重災區。這裡簡單介紹一些基本程式設計要點, 相對系統安全來說,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 =
  DB SQL預處理
  mysql_real_escape_string (很多PHPer仍在依靠addslashes防止SQL注入,但是這種方式對中文編碼仍然是有問題的。addslashes的問題在於駭客可以用0xbf27來代替單引號,GBK編碼中0xbf27不是一個合法字元,因此addslashes只是將0xbf5c27,成為一個有效的多位元組字元,其中的0xbf5c仍會被看作是單引號,具體見這篇文章)。用mysql_real_escape_string函數也需要指定正確的字元集,否則依然可能有問題。
  prepare + execute(PDO)
  ZendFramework可以用DB類的quote或者quoteInto, 這兩個方法是根據各種資料庫實施不用方法的,不會像mysql_real_escape_string只能用於mysql
  用戶輸入的處理
  無需保留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_filemove_uploaded_file函數,使用HTTP_POST_FILES[]陣列。並通過去掉上傳目錄的PHP解釋功能來防止用戶上傳php腳本。
  ZF框架下可以考慮使用File_upload模組
  SessionCookieForm的安全處理
  不要依賴Cookie進行核心驗證,重要資訊需要加密, Form Post之前對傳輸資料進行雜湊, 例如你發出去的form元素如下:

<input type="hidden" name="H[name]" value="<?php echo $Oname?>"/> <input type="hidden" name="H[age]" value="<?php echo $Oage?>"/> <?php $sign = md5('name'.$Oname.'age'.$Oage.$secret); ?> <input type="hidden" name="hash" 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;
  }
  PHP安全檢測工具(XSSSQL Insertion)
  Wapiti – Web application security auditor(Wapiti – 小巧的網站漏洞檢測工具) (SQL injection/XSS攻擊檢查工具)
  安裝/使用方法:
  apt-get install libtidy-0.99-0 python-ctypes python-utidylib
  python wapiti.py http://Your Website URL/ -m GET_XSS
  Pixy: XSS and SQLI Scanner for PHP( Pixy – PHP 源碼缺陷分析工具)
  安裝: apt-get install default-jdk
 PHP代碼安全和XSSSQL注入等對於各類網站的安全非常中用,尤其是UGC(User Generated Content)網站,論壇和電子商務網站,常常是XSSSQL注入的重災區。這裡簡單介紹一些基本程式設計要點, 相對系統安全來說,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 =
  DB SQL預處理
  mysql_real_escape_string (很多PHPer仍在依靠addslashes防止SQL注入,但是這種方式對中文編碼仍然是有問題的。addslashes的問題在於駭客可以用0xbf27來代替單引號,GBK編碼中0xbf27不是一個合法字元,因此addslashes只是將0xbf5c27,成為一個有效的多位元組字元,其中的0xbf5c仍會被看作是單引號,具體見這篇文章)。用mysql_real_escape_string函數也需要指定正確的字元集,否則依然可能有問題。
  prepare + execute(PDO)
  ZendFramework可以用DB類的quote或者quoteInto, 這兩個方法是根據各種資料庫實施不用方法的,不會像mysql_real_escape_string只能用於mysql
  用戶輸入的處理
  無需保留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_filemove_uploaded_file函數,使用HTTP_POST_FILES[]陣列。並通過去掉上傳目錄的PHP解釋功能來防止用戶上傳php腳本。
  ZF框架下可以考慮使用File_upload模組
  SessionCookieForm的安全處理
  不要依賴Cookie進行核心驗證,重要資訊需要加密, Form Post之前對傳輸資料進行雜湊, 例如你發出去的form元素如下:


<input type="hidden" name="H[name]" value="<?php echo $Oname?>"/> <input type="hidden" name="H[age]" value="<?php echo $Oage?>"/> <?php $sign = md5('name'.$Oname.'age'.$Oage.$secret); ?> <input type="hidden" name="hash" 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;
  }
  PHP安全檢測工具(XSSSQL Insertion)
  Wapiti – Web application security auditor(Wapiti – 小巧的網站漏洞檢測工具) (SQL injection/XSS攻擊檢查工具)
  安裝/使用方法:
  apt-get install libtidy-0.99-0 python-ctypes python-utidylib
  python wapiti.py http://Your Website URL/ -m GET_XSS
  Pixy: XSS and SQLI Scanner for PHP( Pixy – PHP 源碼缺陷分析工具)
  安裝: apt-get install default-jdk

自由轉載,轉載請注明: 轉載自WEB開發筆記 www.chhua.com

本文來源於WEB開發筆記 http://www.chhua.com , 原文地址: http://www.chhua.com/web-note698

沒有留言:

張貼留言