Php安全規範

 

一.基本準則

    1. 全部的用戶輸入都是有害的,對全部從客戶端傳入的數據都不信任, 須要作判斷和過濾(類型,長度,格式,範圍),不然可能會受到SQL Injection、XSS等攻擊。好比:$_GET, $_POST, $_COOKIE, $_FILES, $REQUEST等。 直接使用將可能存在被注入的危險。

 

    1. 用戶的相關輸入涉及數據庫操做時須要對輸入作專門的轉換。例如: 數據庫操做中數字型的須要作intval轉換,字符串類型的須要經過mysql_real_escape_string過濾。

 

    1. 用戶上傳的文件的文件名必須隨機從新命名,並限制其後綴,大小,類型,並以明確的後綴結束。

 

    1. 數據庫操做必須使用安全數據庫操做類.不使用安全數據庫操做類的,使用Intval對整數型參數過濾,使用mysql_real_escape_string對字符串型進行過濾,並要配合mysql_set_charset設置當前字符集進行使用。PHP版本小於5.0.5的,須使用SET character_set_connection=字符集, character_set_results=字符集, character_set_client=binary; 這三句語句替代mysql_set_charset進行數據庫字符集設置。在能用PDO的狀況下,最好用PDO的預編譯功能。

 

    1. 最好別使用PHP調用shell,若實在要調用shell命令時,輸入參數做爲system,exec,passthru等任何命令執行函數的參數時,要使用escapeshellarg函數進行過濾。(escapeshellcmd在某些條件下會存在漏洞,所以強烈推薦使用escapeshellarg) 。

 

    1. 輸入參數做爲php文件內容時,要使用var_export進行數據導出。字符串儘可能用’ ‘而不是」 「進行引用,一個是效率問題,一個是安全問題。

 

    1. 輸出到網頁中的變量要用htmlspecialchars 處理轉義 防止xss攻擊。

 

    1. 如有輸入變量帶到網址跳轉中去,必須校驗域名地址,防止經過URL被篡改,從當前網站跳轉到欺詐網站,產生釣魚攻擊。

 

    1. 一些其它數據來源:好比導入excel數據,在進入庫或者查詢時。必須進行轉義處理。

 

    1. 對外提供API接口的,數據傳輸過程當中建議使用rsa+aes 相結合的方式來作加密處理,防止數據傳輸過程當中被嗅探和篡改.

 

    1. 入庫中存放密碼不能明文,用戶密碼不能用純md5加密 應該用md5+salt等

 

    1. 在表單提交中,最好加入token機制,以防CSRF攻擊。

 

  1. 若文件包含了一個用戶輸入變量,請校驗後綴,路徑等信息,過濾一些跨目錄符號。如:../ ..\ .. 等 防止文件遍歷。

二.安全配置

    1. magic_quotes_gpc = On 注:此配置項在php5.4中已經移除。自動把用戶提交的變量進行轉換,好比把 ‘ 轉爲 \’ 等,至關於php中的addslashes()函數的處理。這對防止sql注射有重大做用。

 

    1. register_globals=off 注:register_globals容許php將$_GET,$_POST,$_COOKIE等變量裏的內容自動註冊爲全局變量,若是程序裏的某些變量沒有通過初始化而直接使用將致使安全問題。

 

    1. expose_php=off 注:避免PHP版本信息暴露。

 

    1. display_errors = Off 注:頁面不顯示錯誤顯示

 

    1. Safe_mode=on 注:啓用安全模式

 

    1. disable_functions=exec,passthru,popen,proc_open,shell_exec,system,phpinfo, assert 注:禁用一些危險函數,

 

    1. allow_url_fopen = Off allow_url_include = Off 注:防止遠程包含漏洞。

 

    1. session.cookie_httponly = 1 注:防止在xss漏洞中暴露cookies

 

  1. 設置好合適的 open_basedir  防止一個網站被入侵,同服全部網站被淪陷風險的跨站點攻擊。

三.其它容易被忽略的地方

  1. 注意php各版本之間的區別 好比:php5.4 php5.5中 $_REQUEST 默認只包含 $_GET $_POST 不包含$_COOKIESphp

     public function dispose_request()
         {
             $_POST = daddslashes($_POST);
             $_GET  = daddslashes($_GET);
             $_REQUEST = daddslashes($_REQUEST);
     }
     上面的代碼若是是在PHP5。3以上的環境中運行  $_COOKIES變量是沒有通過轉義的。
    
  2. 通用過濾轉義函數在過濾數組時,別忘記對$key過濾html

     function daddslashes($string, $force = 0)
     {
         if (!get_magic_quotes_gpc() || $force)
         {
             if (is_array($string))
             {
                 foreach ($string as $key => $val)
                 {
                     $string[$key] = daddslashes($val, $force);
                 }
             }
             else
             {
                 $string = addslashes($string);
             }
         }
         return $string;
     }
       $test[「username’a」]=」admin’a」 //只轉義了數組對應的value  key沒有轉義
       $test=daddslashes($test);
    
  3. 在用preg_replace 中,慎用e 參數mysql

       function dunserialize($string)
       {
           return unserialize(preg_replace('!s:(\d+):"(.*?)";!se', '"s:".strlen("$2").":\"$2\";"', $string));
       }
       $str='s:123:"${phpinfo()}";';
       dunserialize($str);   //程序最終會執行php代碼,產生代碼執行漏洞
    
        其它會產生相似代碼執行漏洞的函數還有:
         eval create_function call_user_func call_user_func_array assert  等 在使用這些函數時務必注意參數的合法性。
    
  4. parse_str使用過程當中注意變量覆蓋和注入漏洞sql

     parse_str('a=%27');
     php<=5.3  $a=\’
     Php>5.3  $a=’
    
  5. 在要對瀏覽器標識入庫時,必須作轉義處理。shell

     $agent = addslashes($_SERVER['HTTP_USER_AGENT']);
    
  6. 在取客戶端IP中。若取到了$_SERVER[‘HTTP_X_FORWARDED_FOR’]這段。請校驗該字段的值是否爲IP格式。由於這字段內容可隨意僞造。
相關文章
相關標籤/搜索