如何強制關閉 Azure Web Apps 內建支援的 PHP 執行環境 | The Will Will Web

The Will Will Web

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

如何強制關閉 Azure Web Apps 內建支援的 PHP 執行環境

前幾天有個朋友告知部署在 Azure Web App 的網站被駭客入侵,可能被植入木馬後門之類的程式,我上去查看之後發現,果然被寫入了一個編碼過的 PHP 程式,確認為後門程式。明明是一台只有跑 ASP.NET 的網站,隨便被植入一個 PHP 檔案,竟然也能被執行。而且還沒有關閉的管道,連 Azure Portal 都無法設定關閉。本篇文章將分享強制關閉 PHP 的方法,如果有人也將網站跑在 Azure Web App 網站上,建議花點時間設定一下。

環境說明

由於 Azure App Service 是 Azure 平台相當重要的 PaaS 網站服務,在這個服務上可以方便的執行 ASP.NET, .NET Core, PHP, Java, Python 甚至於任意版本的 Node.js 皆可,是個相當全面且方便的 PaaS 平台。除了基本執行環境外,還有超過 100 種進階設定,像是備份還原、自訂域名、免費 TLS/SSL 憑證綁定、線上編輯器(App Service Editor)、部署位置、自動延展執行個體、...等等。

不過,最近發現的這個問題,感覺有點不妙,在支援 Windows 平台的 Web App 網站上,無論你設定哪種執行環境(ASP.NET, .NET Core, Java, Python, Node.js),都會支援 PHP 執行,而且沒有關閉的方法。總之,PHP 的執行環境已經裝好了,不管你要不要用,東西就在這裡。偏偏 PHP 的後門因為太好寫,網路上太多版本,駭客也很愛用,因為 PHP 用戶真的很多。

以前 Azure Portal 可以對 Azure Web App 設定關閉 PHP 支援,但現在的版本已經找不到相關設定,即便我們 Stack 選擇 .NET 之後,網站依然可以執行 PHP 程式!

在尋求支援無果之後,我決定利用自己對 IIS 與 Web.config 的理解,自行關閉 PHP 的程式支援。我使用的方法是利用 IIS 內建的 Request Filtering 模組,禁止存取所有 .php 副檔名的 HTTP 要求。

解決方案

只要在網站跟目錄下新增一個 web.config 檔案,就可以有效阻擋所有 .php 副檔名的程式在網站中執行:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <security>
      <requestFiltering>
        <fileExtensions>
          <add fileExtension=".php" allowed="false" />
        </fileExtensions>
      </requestFiltering>
    </security>
  </system.webServer>
</configuration>

當然,如果你想阻止更多類型的程式執行,也可以如法炮製,將不希望提供服務的程式 (必須要有副檔名的 HTTP 要求),全部透過 IIS 內建的 Request Filtering 功能拒絕存取!

如果網站下已經有 web.config 檔案存在,請自行合併設定到現有 web.config 檔案中。

相關連結