萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 網路安全 >  >> 路由器知識 >> 路由器基礎

PHP 修復「頁面異常導致本地路徑洩露」漏洞:關閉錯誤顯示的三種實戰方法

360 網站安全檢測報告「頁面異常導致本地路徑洩露」,本質是 PHP 錯誤信息直接輸出到前端,洩露絕對路徑、文件結構、數據庫連接信息等敏感內容,助長攻擊者偵察。核心修復:**禁止生產環境顯示錯誤詳情,改為記錄日誌**。

三種關閉 PHP 錯誤顯示的方法 (按推薦優先級)

方法一:修改 php.ini (全局生效,需服務器權限) ⭐⭐⭐

; 找到並修改
display_errors = Off
; 建議同時開啟錯誤日誌
log_errors = On
error_log = /var/log/php/error.log
; 生產環境建議錯誤級別
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT & ~E_NOTICE

修改後重啟 PHP-FPM/Apache/Nginx:systemctl restart php-fpm 或 systemctl restart httpd/nginx

方法二:修改 Apache 配置 (虛擬主機級/目錄級) ⭐⭐

httpd.conf / apache2.conf / .htaccess / 虛擬主機配置 中添加:

php_flag display_errors off
php_value error_reporting 32759  # E_ALL & ~E_DEPRECATED & ~E_STRICT & ~E_NOTICE
php_flag log_errors on
php_value error_log "/var/log/php/vhost_error.log"

優點:單站點生效,不影響同服務器其他站點。
缺點:需 AllowOverride Options 或修改主配置並重啟 Apache。

方法三:PHP 代碼層面強制關閉 (虛擬主機/無服務器權限首選) ⭐⭐⭐

在**項目入口文件最頂部** (如 index.php、common.php、框架啟動文件) **第一行** 添加:

<?php
ini_set('display_errors', '0');      // 關閉顯示
ini_set('log_errors', '1');          // 開啟日誌
ini_set('error_log', __DIR__.'/logs/php_error.log'); // 指定日誌路徑 (需可寫權限)
error_reporting(E_ALL & ~E_DEPRECATED & ~E_STRICT & ~E_NOTICE);
?>

✅ **最通用、無需服務器權限、立即生效、不影響其他站點**。
💡 框架項目 (Laravel/ThinkPHP/CodeIgniter/Yii) 應在框架啟動文件或 public/index.php 極早期調用。

驗證修復有效性

  1. 構造一個錯誤:訪問不存在的變量/調用未定義函數/除零
  2. 瀏覽器訪問該頁面:**不應顯示任何錯誤堆棧/路徑/代碼片段**
  3. 應顯示:空白頁 / 通用錯誤頁 (如 500.html) / 框架自定義錯誤頁
  4. 檢查錯誤日誌文件:確認錯誤詳情已寫入 (路徑、行號、堆棧、變量值)

進階:生產環境錯誤處理最佳實踐

  1. 自定義錯誤頁面:Nginx error_page 500 /500.html;、Apache ErrorDocument 500 /500.html、PHP set_error_handler() / 框架異常處理器
  2. 錯誤分級記錄:
    - E_ERROR/E_CORE_ERROR/E_COMPILE_ERROR/E_USER_ERROR → 致命,立即告警
    - E_WARNING/E_USER_WARNING → 警告,日誌記錄
    - E_NOTICE/E_DEPRECATED → 開發期修復,生產環境可降級或忽略
  3. 敏感信息過濾:日誌中脫敏 數據庫密鑰、API Key、用戶隱私字段
  4. 日誌輪轉:logrotate 切割、壓縮、保留 30 天,防止磁盤爆滿
  5. 監控告警:Promtail/Grafana Loki + Alertmanager / ELK + Watcher / Sentry 實時捕獲異常

IIS + ASP.NET 環境對應修復

web.config 中配置:

<configuration>
  <system.web>
    <customErrors mode="RemoteOnly" defaultRedirect="/500.html" />
    <compilation debug="false" />
  </system.web>
  <system.webServer>
    <httpErrors errorMode="DetailedLocalOnly" existingResponse="Replace" />
  </system.webServer>
</configuration>

參考:360 論壇 ASP.NET 修復指引

常見誤區提醒

  • ❌ 以為關閉 display_errors 就萬無一失 → **必須同時開啟 log_errors**,否則盲目排錯
  • ❌ 只在報錯頁面加代碼 → **必須在入口/公共文件最頂部**,覆蓋全站
  • ❌ 以為 .htaccess 生效 → 確認 AllowOverride Options 或 AllowOverride All
  • ❌ 修改 php.ini 未重啟服務 → **必須重啟 PHP 進程**
copyright © 萬盛學電腦網 all rights reserved