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

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

\---

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

![IIS 6.0 驗證方法 -> 啟用匿名存取](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/211caf922296428d85e5-image_3.png) 

不過如果你安裝 [FastCGI Extension for IIS6.0](http://www.iis.net/downloads/default.aspx?tabid=34&g=6&i=1521) 並搭配 PHP5 執行的話，在使用**匿名存取**的情況下，卻是以 **應用程式集區身份識別** ( NETWORK SERVICE ) 身份執行。

![IIS 6.0 DefaultAppPool 內容 -> 應用程式集區身份識別 ( NETWORK SERVICE )](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/1bb3bec6d9531b62126a-image_6.png)

這兩者的差別對於你設定網站目錄的 **存取控制清單** ([ACL](http://en.wikipedia.org/wiki/Access_control_list)) 非常重要，如果不小心設定錯誤，你的 PHP 程式就可以很輕易的建立目錄、寫入檔案到你的網站上。

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

\---

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

\---

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

\---

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

以 FastCGI 的安裝為例，設定的步驟如下：

1.  新增一個 **.htm** 的對應值，並設定執行檔路徑為 **C:\\WINDOWS\\system32\\inetsrv\\fcgiext.dll**  
    ![新增/編輯應用程式副檔名對應](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/7c2b953b61111befb405-image_14.png)  
    ![應用程式設定 - 對應](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/1512a3172afd1ef4e29a-image_thumb.png)  
      
    
2.  開啟 C:\\windows\\system32\\inetsrv\\fcgiext.ini 設定檔  
    
    ```
    [Types]
    php=PHP-All
    htm=PHP-All
    ```
    

**備註：不需要重新啟動 IIS 就會生效了！**

\---

如果需要透過 PHP 上傳檔案並使用 [move\_uploaded\_file](http://php.net/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 ](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/e2d5c52c690867da6266-image_7.png)

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

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

**相關連結**

-   [FastCGI Extension for IIS6.0 - RTM](http://www.iis.net/downloads/default.aspx?tabid=34&g=6&i=1521)
-   [PHP: Hypertext Preprocessor](http://php.net/)
-   [PHP: move\_uploaded\_file - Manual](http://php.net/move_uploaded_file)
-   [IIS應用程式集區自訂身份識別後如何讓 ASP.NET 正常執行](/post/2008/12/31/ASPNET-and-Application-Pool-Identity-setting-in-IIS-60)
-   [\[PHP\] 時區設定(date.timezone)](http://jax-work-archive.blogspot.com/2009/07/php-datetimezone.html)
