背景
根据上传安全最佳实践文章的建议,在我的 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 等)。
我不是安全专家,但我不明白这在已经正确配置的服务器上应该做什么?