为了拥有安全的上传页面。我们需要使用以下内容阻止上传任何可执行文件:php
,asp
:
<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文件....
答案 0 :(得分:1)
您的问题应该是(如何验证图片)
的功能之一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。它不会以这种方式执行。