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