如何防止使用htaccess上传.htaccess文件

时间:2014-03-02 09:38:32

标签: php .htaccess

为了拥有安全的上传页面。我们需要使用以下内容阻止上传任何可执行文件:phpasp

<Files *.php>
Deny from All
</Files>

但是如果有人试图上传.htaccess文件怎么办? 如何防止在htaccess中上传.htaccess个文件?

修改
任何人都可以更改标题以上传php文件或asp或其他任何内容,包括.htaccess

嗯,这是一个外观漂亮且安全的代码:

$extension = pathinfo($_FILE['file']);
$valid = ['jpg','png','gif'];
if(in_array($extension,$valid))
    // ok. upload file
else
    // something is wrong.

但是我可以将php文件重命名为test.jpg文件并上传它,它是一个有效的jpg文件,我的脚本将允许它上传,现在,我更改标题并更改{{1到test.jpg文件,并假设这个test.php文件是一个shell文件....

1 个答案:

答案 0 :(得分:1)

您的问题应该是(如何验证图片)

这是exif_imagetype()

的功能之一
  

exif_imagetype - 确定图像的类型

然后将该函数返回给您的内容与您的白名单图像类型进行比较。

  

找到正确的签名后,相应的常量值将为   否则返回值为FALSE。返回值是   与getimagesize()在索引2中返回的值相同但是   exif_imagetype()要快得多。

样本用法:

if (exif_imagetype('image.gif') != IMAGETYPE_GIF) {
    echo 'The picture is not a gif';
}

如果您想允许多种类型,请将它们包含在一个数组中,并检查该数组中是否存在retured类型。


另一个解决方案是使用getimagesize(),它会在非图像上返回零的大小。


除了注意:将所有图像上传到单独的子目录,而不是包含某些php文件或任何其他代码文件的目录。



更新:

根据您的评论。如果您希望允许用户上传他们希望的任何类型的文件[不仅是图像],那么对所有类型的文件进行验证似乎无穷无尽。因此,如果我这样做,我会掩盖该文件并使其不可执行。但是,如果您有一组允许上传的文件,那么我建议您将其列在某处并对其进行验证。

1. 方法1 :重命名文件和/或将其扩展名更改为其他内容。 服务器仅配置为执行一组已知类型的文件。 如果用户选择上传file.php,则将该文件名保存到数据库中,并将实际文件的名称重命名为file_[timestamp][user_id][randome_code],并将新名称保存到数据库中。然后,只要用户请求该文件,只需将其重命名为原始名称并允许他/她下载。

2. 方法2 :将文件压缩为.zip。它不会以这种方式执行。