filesmatch 导致 php 下载未解析

filesmatch 导致 php 下载未解析

背景

根据上传安全最佳实践文章的建议,在我的 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 视为八位字节流(从而下载它)或防止脚本伪装成图像运行的另一种方法

提前致谢

答案1

<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 等)。

我不是安全专家,但我不明白这在已经正确配置的服务器上应该做什么?

相关内容