Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP图像上传。如何保护包含代码的图像?_Php_File Upload - Fatal编程技术网

PHP图像上传。如何保护包含代码的图像?

PHP图像上传。如何保护包含代码的图像?,php,file-upload,Php,File Upload,据我所知,-图像(jpeg、gif等)可能包含有效的php/python/perl等代码。所以-任何人都可以创建文件,将是有效的jpeg在同一时间可以执行PHP解释器。(以下是描述:) 所以-我想知道-有没有办法从图像中去除恶意代码?用GD或imagemagic重新编码图像是否有效 谢谢 实际图像将不包含代码。但是没有什么能阻止某人尝试上传一个“图像”文件,然后尝试执行它 您的解释器(Perl、PHP等)应该设置为只执行某些文件类型(即.PHP或.php5)。Perl或PHP没有理由解析图像文件

据我所知,-图像(jpeg、gif等)可能包含有效的php/python/perl等代码。所以-任何人都可以创建文件,将是有效的jpeg在同一时间可以执行PHP解释器。(以下是描述:)

所以-我想知道-有没有办法从图像中去除恶意代码?用GD或imagemagic重新编码图像是否有效


谢谢

实际图像将不包含代码。但是没有什么能阻止某人尝试上传一个“图像”文件,然后尝试执行它

您的解释器(Perl、PHP等)应该设置为只执行某些文件类型(即.PHP或.php5)。Perl或PHP没有理由解析图像文件

只需使用以下常识来保护自己:

1) 验证文档的mime类型
2) 强制执行仅允许上载特定扩展名的文件的策略
3) 不要接受表面上的文件名。生成您自己的内部文件名,并使用数据库表来保持映射。

4) 如果你真的很偏执,找一些代码来检查字节签名对于给定的文件类型上传是否有效。

你应该配置你的Web服务器,不允许PHP解释你的图像文件扩展名。如问题中链接的页面所示,图像可以包含PHP代码。始终根据白名单检查文件扩展名:

<?php  
$whitelist = '/\.(?:jpe?g|png|gif)$/i'; 
if (!preg_match($whitelist, $_FILES['userfile']['name'])) {  
    echo "Bad filename extension.";  
    exit;  
}
$uploaddir = 'uploads/';  
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);  
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {  
    echo "File is valid, and was successfully uploaded.";  
} else {  
    echo "File uploading failed.";  
}  
?>


在用户上传的文件所在的目录中,最好只是阻止执行PHP等。是的。谢谢我已经在做这件事了。但是在服务器上不要有任何恶意代码似乎仍然很有帮助,以防以后会有服务器切换/升级或其他人管理服务器而不知道这一点。1)由客户端设置-很容易被欺骗2)即使我们现在确切知道PHP解释的文件扩展名,我们不能保证将来在web服务器上安装其他应用程序时,这种情况不会发生变化。到那时,每个人都一定会忘记,服务器的安全性取决于此设置。3) 这对搜索引擎优化也不好——会有更高的数据库负载,还有——如果我需要一个图像url来发送电子邮件或其他什么4)我确实使用了魔法数据库的文件信息,所以我想我是偏执狂,但字节头仍然很容易被欺骗。嗯,反驳一下,1)我不是说验证客户端的mime类型,而是使用库来分析实际文件;2) PHP永远不应该解析图像文件以将其作为PHP代码执行;3) 同意这一部分,但大多数允许上传图像的大型网站也这么做;如果你需要一个链接,那么给用户一个实际文件的链接;您不必使用它们的文件名(在发生冲突的情况下确实不应该使用);请注意#4,您应该始终在服务器端对实际文件执行分析,这样就不能对其进行欺骗。当用户上传文件时,浏览器(或swf/java插件)会根据文件提交mime信息。这是在$_FILES[“File”][“type”]中显示的内容,可以进行欺骗。如果您在服务器端验证mime类型—这通常是通过使用magic数据库和finfo_文件函数来完成的—这会更加可靠,但仍然没有人阻止攻击者在上载文件之前添加不正确的字节头。所以,回想起来,如果你的意思是你的1)应该在服务器端完成,那么你的1)和4)是一样的。@Andre:MIME类型甚至魔法字节都可以被欺骗,这是绝对正确的。问题是这是否是攻击的威胁向量。如果您允许用户上传内容,则没有100%确定的方法来限制某人将上传的内容。但考虑到标准的服务器强化实践,您不应该执行任何用户上传的内容,也不应该允许用户上传php/perl/可执行文件。除非您亲自检查上载的每个文件,否则无法完全阻止它,这是不实际的。上载文件名中的扩展名可能很容易规避,最好使用
getimagesize()
函数返回图像的真正mime类型,根据实际文件内容。检测mime类型的推荐方法是使用PHP的finfo函数。但这仍然是攻击者可以改变的。