Security

filesmatch 導致 php 被下載未解析

  • February 11, 2017

背景

根據上傳安全最佳實踐文章的建議,在我的 htaccess 文件中有以下程式碼段:

ForceType application/octet-stream
<FilesMatch "(?i).jpe?g$">
   ForceType image/jpeg
</FilesMatch>
<FilesMatch "(?i).gif$">
   ForceType image/gif
</FilesMatch>
<FilesMatch "(?i).png$">
   ForceType image/png
</FilesMatch>
<FilesMatch "(?i).css$">
   ForceType text/css
</FilesMatch>

這應該是為了防止人們在圖像等中隱藏 php 程式碼,儘管我擔心儘管搜尋了我的歷史,但我還是找不到這個片段的來源,這是不久前的事了

問題

這在我的本地開發伺服器(XAMPP)上按預期工作,但現在我已經開始在生產伺服器上設置這個片段似乎強制下載 PHP 文件而不是執行

由於系統使用 htaccess 通過 public/index.php 路由所有文件,因此為 .php 添加新指令不起作用:

<FilesMatch "(?i).php$">
   ForceType application/x-httpd-php
</FilesMatch>

我似乎想出了一種方法來阻止這種情況的發生 - 我正在尋找一種防止文件匹配的方法,將 php 視為八位字節流(並因此下載它)或防止腳本偽裝成圖像的替代方法跑步

提前致謝

<FilesMatch "(?i).php$">
   ForceType application/x-httpd-php
</FilesMatch>

相反,嘗試ForceType None恢復到正常的 mime 類型關聯。例如:

<FilesMatch "(?i)\.php$">
   ForceType None
</FilesMatch>

請注意,您還應該轉義正則表達式中的點以匹配文字點而不是任何字元。(這也適用於所有FilesMatch容器。)


您最初的“問題”顯然是您的第一行:ForceType application/octet-stream. 暴露你的 PHP 原始碼本身就是一種安全風險,所以我不禁質疑這段程式碼的可信度?這個在本地伺服器上“工作”的事實可能只是 PHP 的安裝方式(模組、CGI/FastCGI 等)

我不是安全專家,但我看不到這應該在已經正確配置的伺服器上做什麼?

引用自:https://serverfault.com/questions/832023