Apache web 服務器提供了這種便利 :經過 HTTP 或 HTTPS 協議,訪問文 件和內容。配置不當的服務器端腳本語言會帶來各類各樣的問題。因此, 使用 PHP 時要當心。如下是 25 個 PHP 安全方面的最佳實踐,可供系統管理 員們安全地配置 PHP。 爲 PHP 安全提示而提供的示例環境 ◆文件根目錄(DocumentRoot):/var/www/html ◆ 默 認 的 Web 服 務 器 :Apache(可 以 使 用 Lighttpd 或 Nginx 來 取 代 Apache) ◆默認的 PHP 配置文件 :/etc/php.ini ◆默認的 PHP 加載模塊配置目錄 :/etc/php.d/ ◆咱們的示例 php 安全配置文件 :/etc/php.d/security.ini(須要使用文 本編輯器來建立該文件) ◆ 操 做 系 統 :RHEL/CentOS/Fedora Linux(相 關 指 令 應 該 與 Debian/ Ubuntu 等其餘任何 Linux 發行版或者 OpenBSD/FreeBSD/HP-UX 等其餘類 似 Unix 的操做系統兼容)。 ◆默認的 php 服務器 TCP/UDP 端口 :無 將全部PHP錯誤記入日誌 別讓 PHP 錯誤信息暴露在網站的全部訪客面前。編輯 /etc/php.d/ security.ini,執行如下指令 : display_errors=Off 確保你將全部 PHP 錯誤記入到日誌文件中 : log_errors=On error_log=/var/log/httpd/php_scripts_error.log 不容許上傳文件 出於安全緣由,編輯 /etc/php.d/security.ini,執行如下命令 : file_uploads=Off 若是使用你應用程序的用戶須要上傳文件,只要設置 upload_max_ filesize,便可啓用該功能,該設置限制了 PHP 容許經過上傳的文件的最大 值 : file_uploads=On # 用戶經過 PHP 上傳的文件最大 1MB upload_max_filesize=1M 關閉遠程代碼執行 如 果 啓 用,allow_url_fopen 允 許 PHP 的 文 件 函 數 —— 如 file_get_ contents()、include 語句和 require 語句——能夠從遠程地方(如 FTP 或網站) 獲取數據。 allow_url_fopen 選項容許 PHP 的文件函數——如 file_get_contents()、 include 語句和 require 語句——能夠使用 FTP 或 HTTP 協議,從遠程地方 獲取數據。編程員們經常忘了這一點,將用戶提供的數據傳送給這些函數 時,沒有進行適當的輸入過濾,於是給代碼注入安全漏洞留下了隱患。基於 PHP 的 Web 應用程序中存在的衆多代碼注入安全漏洞是由啓用 allow_url_ fopen 和糟糕的輸入過濾共同引發的。編輯 /etc/php.d/security.ini,執行 如下指令 : allow_url_fopen=Off 出於安全緣由,我還建議禁用 allow_url_include : allow_url_include=Off 啓用SQL安全模式 編輯 /etc/php.d/security.ini,執行如下指令 : sql.safe_mode=On 若是啓用,mysql_connect() 和 mysql_pconnect() 就忽視傳送給它們的 任何變量。請注意 :你可能得對本身的代碼做一些更改。sql.safe_mode 啓 用後,第三方開源應用程序(如 WorkdPress)及其餘應用程序可能根本運行 不了。我還建議你針對全部安裝的 php 5.3.x 關閉 magic_quotes_gpc,因 爲它的過濾並不有效、不是很可靠。mysql_escape_string() 和自定義過濾 函數能起到更好的做用 : magic_quotes_gpc=Off 控制POST請求的大小 做爲請求的一部分,客戶機(瀏覽器或用戶)須要將數據發送到 Apache Web 服務器時,好比上傳文件或提交填好的表單時,就要用到 HTTP POST 請求方法。攻擊者可能會企圖發送過大的 POST 請求,大量消耗你的系統 資源。你能夠限制 PHP 將處理的 POST 請求的最大大小。編輯 /etc/php. d/security.ini,執行如下命令 : ; 在此設置實際可行的值 post_max_size=1K 1K 設置了 php 應用程序容許的 POST 請求數據的最大大小。該設置還 影響文件上傳。要上傳大容量文件,這個值必須大於 upload_max_filesize。 我還建議你限制使用 Apache Web 服務器的可用方法。編輯 httpd.conf,執 行鍼對文件根目錄 /var/www/html 的如下指令 : <Directory /var/www/html> <LimitExcept GET POST> Order allow,deny </LimitExcept> ## 可在此添加配置的其他部分 ... ## </Directory> 資源控制(拒絕服務控制) 你能夠設置每一個 php 腳本的最長執行時間,以秒爲單位。另外一個建議的 選項是設置每一個腳本可能用於解析請求數據的最長時間,以及腳本可能耗 用的最大內存數量。編輯 /etc/php.d/security.ini,執行如下命令 : # 設置,以秒爲單位 max_execution_time = 30 max_input_time = 30 memory_limit = 40M 爲PHP安裝Suhosin高級保護系統 Suhosin 是一款高級的保護系統,面向安裝的 PHP。它旨在保護服務器和 用戶,遠離 PHP 應用程序和 PHP 核心中的已知缺陷和未知缺陷。Suhosin 分 兩個獨立部分,能夠單獨使用,也能夠組合使用。第一個部分是針對 PHP 核 心的小補丁,實施了幾個低級防禦措施,以防範緩衝器溢出或格式字符串安 全漏洞 ;第二個部分是功能強大的 PHP 加載模塊,實施了其餘全部的保護措 施。 保持PHP、軟件和操做系統版本最新 打安全補丁是維護Linux、Apache、PHP和MySQL服務器的一個重要環節。 應該使用如下其中任何一個工具(若是你經過軟件包管理器來安裝 PHP), 儘快檢查全部的 PHP 安全更新版本,並儘快打上 : # yum update 或 # apt-get update && apt-get upgrade 你能夠配置紅帽 /CentOS/Fedora Linux,以便經過電子郵件發送 yum 軟 件包更新通知。另外一個選項是經過 cron job(計劃任務)打上全部的安全 更新版。在 Debian/Ubuntu Linux 下,能夠使用 apticron 來發送安全通知。 注 :常常訪問 php.net,尋找源代碼安裝的最新版本。 限制文件和目錄訪問 確保你以 Apache 或 www 等非根用戶的身份來運行 Apache。全部文件 和目錄都應該歸非根用戶(或 apache 用戶)全部,放在 /var/www/html 下 : # chown -R apache:apache /var/www/html/ /var/www/html/ 是個子目錄,這是其餘用戶能夠修改的文件根目錄, 由於根目錄歷來不在那裏執行任何文件,也不會在那裏建立文件。 確保在 /var/www/html/ 下,文件權限設成了 0444(只讀): # chmod -R 0444 /var/www/html/ 確保在 /var/www/html/ 下,全部目錄權限設成了 0445 : # find /var/www/html/ -type d -print0 | xargs -0 -I {} chmod 0445 {} 關於設置合適文件權限的補充 chown 和 chmod 命令確保 :無論在什麼狀況下,文件根目錄或文件根目 錄裏面的文件均可以被 Web 服務器用戶 apache 寫入。請注意 :你須要設 置對你網站的開發模型最合理的權限,因此能夠根據自身須要,隨意調整 chown 和 chmod 命令。在這個示例中,Apache 服務器以 apache 用戶的身 份來運行。這能夠在你的 httpd.conf 文件中用 User 和 Group 命令來配置。 apache 用戶須要對文件根目錄下的全部內容享有讀取訪問權,可是不該該 享有寫入訪問權。 確保 httpd.conf 有如下命令,實現限制性配置 : <Directory / > Options None AllowOverride None Order allow,deny </Directory> 因爲篇幅所限,本文僅節選了 25 條最佳實踐當中的 9 條。完整內容見 原文 : 25 PHP Security Best Practices For Sys Admins 譯文 :http://os.51cto.com/art/201111/305014.htmv