为了有一个安全的上传页面。我们需要防止上传像: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文件,我的脚本将允许它上传,现在,我更改标题并将test.jpg更改为test.php文件,并假设这个test.php文件是一个shell文件.。
发布于 2014-03-02 10:20:38
你的问题应该是(如何验证图像)。
这是imagetype()的一个功能。
exif_imagetype -确定图像的类型
然后将该函数作为图像类型返回给您的内容与您的白名单图像类型进行比较。
当找到正确的签名时,将返回适当的常量值,否则返回值为FALSE。返回值与索引2中getimagesize()返回的值相同,但exif_imagetype()要快得多。
样本使用情况:
if (exif_imagetype('image.gif') != IMAGETYPE_GIF) {
echo 'The picture is not a gif';
}如果您希望允许多个类型,那么将它们包含到一个数组中,并检查该数组中是否存在重新定义的类型。
另一种解决方案是使用getimagesize(),它返回非图像大小的零。
备注:将所有图像上传到一个单独的子目录中,而不是包含一些php文件或任何其他代码文件的目录。
更新:
基于你的评论。如果您想让用户上传他们希望上传的任何类型的文件,而不仅仅是图像,那么对所有类型的文件进行验证似乎是无穷无尽的。因此,如果我要这样做,我将掩盖该文件,并使其不可执行。但是,如果您有一组允许上传的文件,那么我建议您列出它的某个位置并对其进行验证。
1.方法1:重命名文件并/或将其扩展名更改为其他文件。服务器只被配置为执行一组已知类型的文件。如果用户选择上传file.php,那么将该文件名保存到db中,并将实际文件的名称重命名为file_[timestamp][user_id][randome_code],并将新名称保存到db中。然后每当用户请求该文件时,只需将其重命名为原始名称,并允许他/她下载。
2.方法2:将文件压缩为.zip。这样是不能执行的。
https://stackoverflow.com/questions/22126006
复制相似问题