如何安全地防止上传的文件在任何服务器上通过PHP运行?

Roo*_*kie 7 php windows apache

我注意到可以通过PHP运行一个文件,即使它的扩展名不是.php,例如文件test.xyz.php.whatever.zyx仍可以用PHP运行,即使扩展名不是.php!它碰巧有.php.文件名,这足以让我的Apache运行PHP脚本.

我尝试(如有人建议)将其放在该.htaccess文件夹的文件中:

php_flag engine off
Run Code Online (Sandbox Code Playgroud)

但它在我的机器上不起作用.

我现在知道的唯一解决方案是:

  • 重命名为已知的文件扩展名,该扩展名不是通过PHP运行的,例如.txt.
  • 从文件名中删除所有点,从而使其无扩展.

但我仍然不确定这些解决方案如何在除我的Windows服务器(使用Apache)之外的其他服务器上运行.

有没有其他解决方案不需要以任何方式重命名文件名?

sae*_*ani 5

对于用户上传,我建议您在根路径上方的图层中上传文件夹,在这种情况下,只有您有权访问上传文件夹(在直接寻址中)且攻击者无法访问此文件夹中的任何文件因此您禁用了攻击者运行恶意文件的操作


Apo*_*ark 5

为了完全安全,您需要做以下几件事:

将上传目录设置在"公共"文件夹上方,使其无法从浏览器访问.此设置位于php.ini(php配置文件)中.您需要重新启动Apache才能使其生效.在大多数Redhat/Fedora/CentOS Web服务器上,这可以是:

upload_tmp_dir = "/var/tmp/"
Run Code Online (Sandbox Code Playgroud)

或者,在我本地的Windows 7 WAMP安装中,它设置为:

upload_tmp_dir = "c:/wamp/tmp"
Run Code Online (Sandbox Code Playgroud)

在.htaccess中禁止脚本在该目录(c:/ wamp/tmp)上运行:

RemoveHandler .php .phtml .php3
RemoveType .php .phtml .php3
php_flag engine off
Run Code Online (Sandbox Code Playgroud)

在PHP脚本中,获取上传的文件,根据mimetype(不是文件类型扩展名)对其进行过滤,更改文件名,并将其放入安全的可公开访问的文件夹中.更详细:

优选地使用MVC框架,例如Zend Framework,其包括文件类型过滤.

如果你做了所有这些,你应该是安全的.显然你永远不会100%安全,因为有无数的模糊攻击针对PHP,MySQL,命令行等,特别是在旧系统上.在较大的公司Web服务器上(我工作),它们禁用所有内容,并有选择地仅启用项目所需的内容.通过WAMP等系统,它们可以实现一切,从而简化本地开发.

在专业项目上工作的良好做法是使用Rackspace或Amazon获取云服务器帐户,并学习如何配置php.ini,httpd.conf设置以及PHP安全最佳实践.一般情况下,不要相信用户输入,期望它是腐败/恶意/格式错误,最终你会安全.


小智 1

php_flag engine off可以使用单个目录的 .htaccess 文件删除 PHP 文件的处理程序。

在您要禁用 PHP 的目录中,您的 .htaccess 应包括:

RemoveHandler .php .phtml .php3 .php4 .php5
RemoveType .php .phtml .php3 .php4 .php5
Run Code Online (Sandbox Code Playgroud)

然而,您可能可以摆脱以下情况,具体取决于AddHandler您在默认 Apache 配置中配置的类型,在 Windows 上,应该位于C:\Program Files\Apache<version>\conf\httpd.conf

RemoveHandler .php 
RemoveType .php 
Run Code Online (Sandbox Code Playgroud)

您还需要确保在您的主 apache 配置文件中,包含 .htaccess 文件的目录被DirectoryAllowOverride FileInfo设置的语句覆盖。您可能希望考虑AllowOverride All是否将 .htaccess 文件用于其他目的 - 请参阅Apache 文档中的 AllowOverride了解差异的说明。