Php 如何禁止Apache上的所有可执行文件

Php 如何禁止Apache上的所有可执行文件,php,security,apache,mod-rewrite,Php,Security,Apache,Mod Rewrite,我想找出最有效的方法来禁止任何可执行文件从一个特定的子文件夹在我的服务器上。我允许用户将文件上载到该文件夹,并希望能够从web访问该文件夹。我用mod_rewrite几乎锁定了根文件夹。在这一个未受保护的子文件夹中,我有.htaccess,其权限为: Options +Indexes IndexOptions +FancyIndexing +FoldersFirst +HTMLTable RewriteEngine off 然而,我不确定是否有一些复杂的黑客仍然允许在服务器上上传和执行s

我想找出最有效的方法来禁止任何可执行文件从一个特定的子文件夹在我的服务器上。我允许用户将文件上载到该文件夹,并希望能够从web访问该文件夹。我用mod_rewrite几乎锁定了根文件夹。在这一个未受保护的子文件夹中,我有.htaccess,其权限为:

Options +Indexes IndexOptions +FancyIndexing +FoldersFirst +HTMLTable RewriteEngine off 然而,我不确定是否有一些复杂的黑客仍然允许在服务器上上传和执行shell脚本,因为所有成功上传的文件都将立即可见

我知道在.htaccess中还有另一个选项可以过滤出如下文件:

$allmime=array('image/gif', 'image/png', 'image/jpeg', 'application/msword', 'application/pdf');
$allext=array('png', 'jpg', 'gif', 'doc', 'pdf');
$path=pathinfo($_FILES['file']['name']);
$mime=trim(shell_exec("file -bi " . $_FILES['file']['tmp_name']));
if( !in_array( $path['extension'], $allext) || !in_array($mime, $allmime) ){
    //ban
}else{
    //allow
}
<FilesMatch "\.(sh|asp|cgi|php|php3|ph3|php4|ph4|php5|ph5|phtm|phtml)$">
    order allow, deny
    deny from all
</FilesMatch>

命令允许,拒绝
全盘否定
但是,我不确定这个列表是否包含所有内容,而且这很难维护,因为将来可能会安装新的扩展


总而言之:除了由
%{HTTP_HOST}
直接执行的php脚本之外,任何人都知道禁止所有服务器可执行文件的好方法。

最好的方法(imo)就是关闭子文件夹中的x(linux中的可执行权限)。因此,我将权限更改为644(登录后您可以读写,但世界只能读)。这可以在cpanel中完成。请确保也将其应用于子文件夹。

通过上载的文件名进行过滤是恶意用户将坏东西带到服务器上的方式。$\u文件名和类型属性是用户提供的数据,没有任何信息表明用户不能上传PHP脚本,只能将其称为“puppies.jpg”


正确的筛选方法是使用类似Fileinfo的内容,并检查实际的MIME类型,然后对其进行筛选

禁用特定目录的服务器端处理程序怎么样?比如:

<Directory /path/to/restrict>
    SetHandler None
    Options None
    AllowOverride None
</Directory>

SetHandler无
选项无
不允许超限
这是未经测试的,但似乎它可能会起作用


更新:显然,我错了。。。但是在一个.htaccess文件中粘贴
AddHandler默认处理程序
似乎确实有效。

拒绝对.htaccess文件中文件夹的完全访问,然后使用下载脚本下载该文件,将节省很多麻烦。

从twitter的bootstrapper.htaccess,这对我来说很有效(只是添加了exe):

#阻止对备份和源文件的访问。
#这些文件可能会被一些文本编辑器留下,并且会带来极大的安全性
#任何人接触到它们时都会有危险。
命令允许,拒绝
全盘否定
满足所有
结果:

禁止


您没有访问此服务器上的/test/test.exe的权限。

您可以做几件事来绝对锁定某些文件夹,以确保PHP无法在其中执行,如果执行PHP上载脚本,并且您不希望世界能够利用您的上载代码在您的服务器上执行任意代码,那么这将非常有用:

  • 在.htaccess中完全禁用有关文件夹的PHP引擎:
php_标志引擎关闭
查看

以下规则将禁止从服务器下载.exe(我添加的.bat)文件:

<Directory "/my/files">
    Require all granted
     RewriteEngine on
     RewriteRule "(\.exe|\.bat)" "-" [F]
</Directory>

要求所有授权
重新启动发动机
重写规则“(\.exe\.bat)”“-”[F]

对不起,伙计,我的文件已经是644了,再加上任何PHP脚本都可以用444执行。那么好吧,你的好,文件不能被任何人执行,即使它们是可执行文件不,我不好,我完蛋了!如果一个PHP文件具有只读权限,这意味着PHP解释器将有权访问该文件,并随后能够对其进行处理。是的,但要运行该文件,您需要访问权限才能运行PHP解释器,而PHP解释器没有访问权限。我建议您阅读(),因为PHP是一种服务器端脚本语言,对世界可读php文件的任何HTTP请求都会向服务器发出信号,将请求传递给php解释器,php解释器将读取和解析脚本。任何页面访问者都可以请求查看php文件。幸运的是,他们在解析后看到了结果。谢谢,但我已经在我的示例中这样做了。我正在检查mime和文件扩展名。加上fileinfo()不可靠,我使用的是shell命令。还有其他建议吗?我想我需要解释为什么mime/扩展检查是不够的。这里有两篇文章解释了为什么可以轻松绕过mime检查]和]。如果我不需要上传文档(pdf、doc等),那么执行getimagesize()、exif_imagetype()、imagepng()就足够了。使用
AddHandler默认处理程序
AddType text/html
可能是控制脚本执行的最佳方法。这样,我就不再仅仅依靠mime检查和文件扩展名检查了。我用嵌入在gif文件中的php代码做了一些有限的测试。Mime检查不会停止上载。如果我不验证扩展名,那么这个gifimg.php文件就可以上传了。如果没有AddHandler或AddType指令,将执行此文件。我可以依靠文件扩展名检查,但它不能保证我允许的扩展名永远不会与任何apache mod关联。这些都是为上传文件夹提供额外保护的绝妙方法。。。只是一个小小的调整,你能纠正第2行“Dispositon”的拼写吗:-)
<Directory "/my/files">
    Require all granted
     RewriteEngine on
     RewriteRule "(\.exe|\.bat)" "-" [F]
</Directory>