首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP FastCGI 在 IIS 下的檔案系統權限問題與解決方案 (補充版)

     編輯:PHP 相關知識

問題場景重述

  • 環境:Windows + IIS 7.5 + PHP (FastCGI)
  • 應用程式集區:整合模式、.NET CLR 2.0、身分識別 = NetworkService
  • 驗證:匿名驗證 (預設使用 IUSR 身分)
  • 網站目錄:C:\Users\Administrator\PhpstormProjects\phpDemo
  • 現象:HTTP 500 → 設定權限後 → HTTP 401

錯誤演進與根因分析

初始 500 錯誤

嘗試 1:Everyone 完全控制 (臨時通過)

Everyone 權限

成功畫面

⚠️ 生產環境嚴禁,安全風險極高。

嘗試 2:授權 NetworkService 讀取權限 (失敗 → 401)

NetworkService 權限

401 錯誤

錯誤詳情顯示登入使用者為「匿名」。檢查 IIS「匿名驗證」編輯:

匿名驗證設定

關鍵發現:IIS 匿名驗證預設使用 IUSR 內建帳號,而非應用程式集區身分 (NetworkService)。

正確解決方案 (二選一)

方案 A:授權 IUSR 讀取/執行權限 (傳統相容)

  1. 資料夾右鍵 → 屬性 → 安全性 → 編輯 → 新增
  2. 輸入 IUSR → 檢查名稱 → 確定
  3. 勾選:讀取和執行、列出資料夾內容、讀取
  4. 確定套用

方案 B:啟用「應用程式集區身分」 (推薦、現代化)

  1. IIS 管理器 → 選中網站 → 雙擊「驗證」
  2. 選中「匿名驗證」 → 右側「編輯」
  3. 選擇 應用程式集區身分 → 確定

此後匿名請求直接使用應用程式集區身分 (NetworkService 或自訂帳號),只需確保該身分有目錄權限即可。

成功畫面

進階權限管理最佳實踐

需求建議身分權限設定位置
靜態檔案/ PHP 腳本讀取應用程式集區身分 / IUSR讀取、讀取和執行、列出內容網站根目錄 NTFS 安全性
上傳目錄/快取/日誌寫入應用程式集區身分修改 (讀寫、刪除、新增)特定子目錄 (如 /uploads, /runtime)
資料庫連線/外部 API應用程式集區身分網路存取 (防火牆出站規則)Windows 防火牆/雲安全組
多站點隔離各站點專用應用程式集區 + 專用帳號最小權限原則建立獨立 AppPool + 自訂身分

常見誤區

  • 以為 NetworkService = IUSR:兩者不同。NetworkService 是服務帳號,IUSR 是匿名網頁使用者帳號。
  • 授權 IIS_IUSRS 群組:NetworkService 屬於此群組,授權群組等同放寬範圍,不如精確授權帳號。
  • 忽略寫入權限:上傳、快取、Session 檔案、日誌都需要寫入權限,請單獨對特定目錄授權。
  • 直接修改檔案屬性「唯讀」:Windows 「唯讀」屬性對資料夾無效,務必用「安全性」標籤設定 ACL。

驗證腳本

<?php
// test_permission.php
$testFile = __DIR__ . '/write_test.tmp';
$testDir  = __DIR__ . '/uploads';

echo "PHP 執行身分: " . get_current_user() . "\n";
echo "進程擁有者: " . exec('whoami') . "\n";

echo "\n--- 讀取測試 ---\n";
echo "讀取自身: " . (is_readable(__FILE__) ? 'OK' : 'FAIL') . "\n";

echo "\n--- 寫入測試 ---\n";
$writeOk = @file_put_contents($testFile, 'test') !== false;
echo "建立檔案: " . ($writeOk ? 'OK' : 'FAIL') . "\n";
if ($writeOk) @unlink($testFile);

echo "\n--- 目錄建立測試 ---\n";
$dirOk = @mkdir($testDir, 0755, true);
echo "建立目錄: " . ($dirOk ? 'OK' : 'FAIL') . "\n";
if ($dirOk) @rmdir($testDir);

部署此腳本訪問,可快速驗證 PHP 進程實際擁有的檔案系統權限。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved