文件匹配导致PHP下载不parsing

背景

根据上传安全性最佳实践文章的build议,在我的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代码,虽然恐怕我无法find这个片段的源代码,尽pipesearch我的历史,这是不久前

问题

这在我的本地开发服务器(XAMPP)上按预期工作,但现在我已经开始在生产服务器上进行设置,这段代码似乎迫使PHP文件被下载而不是执行

由于系统使用htaccess通过public / index.php路由所有文件,为.php添加一个新的指令没有奏效:

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

我似乎想出了一种方法来阻止这种情况的发生 – 我正在寻找一种方法来防止文件匹配治疗php作为一个八位字节stream (并因此下载)或防止代码作为图像伪装替代方法赛跑

提前致谢

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

相反,尝试ForceType None来恢复到正常的MIMEtypes关联。 例如:

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

请注意,你也应该逃避正则expression式中的点来匹配一个文字点而不是任何字符。 (这也适用于所有的FilesMatch容器。)


你最初的“问题”显然是你的第一行: ForceType application/octet-stream 。 暴露你的PHP源代码本身就是一个安全风险,所以我不禁质疑这个代码的可信度? 这个“在你的本地服务器上工作”的事实可能只是PHP的安装方式(模块,CGI / FastCGI等)

我不是一名安全专家,但是我没有看到在一个已经正确configuration的服务器上应该做什么?