The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

在 IIS 6.0 安裝 PHP 5 的注意事項 (安全性議題 與 安裝技巧)

最近我發現在 IIS 6.0 上安裝 PHP5 有一些安全性的議題與一些安裝技巧,而這些問題都是一般管理人員不容易發現的部分,所以若有人希望 PHP 5 在 IIS 上面執行時,可以參考一下這篇文章。

---

如果你安裝 ISAPI Module for PHP5 ( php5isapi.dll ) 的話,在使用匿名存取的情況下,預設 PHP5 會以 匿名存取身份識別 ( IUSR_MachineName ) 身份執行。

IIS 6.0 驗證方法 -> 啟用匿名存取 

不過如果你安裝 FastCGI Extension for IIS6.0 並搭配 PHP5 執行的話,在使用匿名存取的情況下,卻是以 應用程式集區身份識別 ( NETWORK SERVICE ) 身份執行。

IIS 6.0 DefaultAppPool 內容 -> 應用程式集區身份識別 ( NETWORK SERVICE )

這兩者的差別對於你設定網站目錄的 存取控制清單 (ACL) 非常重要,如果不小心設定錯誤,你的 PHP 程式就可以很輕易的建立目錄、寫入檔案到你的網站上。

例如 PHP 若被發現什麼安全性漏洞,而你又來不及更新 PHP 版本,而網站目錄權限又沒有被正確設定的話,就會輕易的被植入木馬,這是件非常危險的事,不得不謹慎行事。

---

另外,如果一台 IIS 上安裝多個不同的 PHP 網站時,也建議不要使用相同的身份識別進行站台設定,否則大家共用相同的權限,對網站安全性來說也是有風險的。

---

我個人比較推薦使用 FastCGI 執行 PHP,除了比較穩定外,執行速度也會比較快。

---

如果你希望所有 *.htm 的檔案也要執行 PHP 的話,自行定義 應用程式設定 中的應用程式副檔名對應

以 FastCGI 的安裝為例,設定的步驟如下:

  1. 新增一個 .htm 的對應值,並設定執行檔路徑為 C:\WINDOWS\system32\inetsrv\fcgiext.dll
    新增/編輯應用程式副檔名對應
    應用程式設定 - 對應

  2. 開啟 C:\windows\system32\inetsrv\fcgiext.ini 設定檔
    [Types]
    php=PHP-All
    htm=PHP-All

備註:不需要重新啟動 IIS 就會生效了!

---

如果需要透過 PHP 上傳檔案並使用 move_uploaded_file 函式時,若是 User 上傳「中文檔名」會導致檔案無法儲存的問題,若要解決這個問題必須要改寫程式才行。

原本的程式:

move_uploaded_file($file['tmp_name'], 
                   $dir . mb_basename($file['name']))

修改後的程式:

move_uploaded_file($file['tmp_name'], 
                   $dir . mb_basename(mb_convert_encoding($file['name'], "big5","utf8")))

---

PHP 5 安裝到 Windows 平台後,還會有「時區」的問題,原本在 Linux 平台執行時時區都很正常,也就是標準的台灣時區 GMT +0800,不過當移到 Windows 平台後會全部被重設成 GMT +0000 ( 格林威治標準時區 ),要解決這個問題必須在 WIndows 系統環境變數加入 TZ 變數,並指派變數值為 Asia/Taipei 即可,如下圖示:

在 WIndows 系統環境變數加入 TZ 變數,並指派變數值為 Asia/Taipei

設定完成後,記得要執行 iisreset 指令才會生效喔!

如果要查詢其他國家的時區變數值可以參考以下網址:http://www.theprojects.org/dev/zone.txt

相關連結