用php实现上传文件的安全

用php实现上传文件的安全,php,upload,Php,Upload,我有一个上传在我的网站,当我使用这个代码来检查文件类型 if($_FILES['fileToUpload']['type']=='image/jpeg' || $_FILES['fileToUpload']['type']=='image/gif' || $_FILES['fileToUpload']['type']=='image/png' ) { $file_Name = time().".".end(explode(".",$_FILES['fileToUpload']["na

我有一个上传在我的网站,当我使用这个代码来检查文件类型

if($_FILES['fileToUpload']['type']=='image/jpeg' || $_FILES['fileToUpload']['type']=='image/gif' || $_FILES['fileToUpload']['type']=='image/png' )
 {
     $file_Name = time().".".end(explode(".",$_FILES['fileToUpload']["name"]));
     $_FILES["fileToUpload"]["name"] = $file_Name;
       move_uploaded_file(@$_FILES["fileToUpload"]["tmp_name"], "upload/" . @$_FILES["fileToUpload"]["name"]);
$msg .='Your file was uploaded successfully';
}
但一些黑客,他们可以黑客和上传php文件,有没有办法更安全


注意:当我创建php文件时,我将其消光改为.jpg,然后我上传该文件,它将被上传

是的,它完全易受攻击。在
$\u文件
中,以下参数受用户控制:

['type']
['name']
伪造上传并允许以下情况,这绝非小事:

['type'] = 'image/jpeg';
['name'] = 'nasty_hacking_script.php';
砰的一声,他们通过你的(可笑的)安全。由于您允许用户定义的文件扩展名通过您的系统,并且只需要执行一个简单的基于时间的重命名,因此您最终将得到如下结果

 1234567890.php
在站点的文档根目录中。如果名称是基于时间的,攻击者也可以简单地戳一下您的服务器并猜测上传的确切时间,例如

 for($i = 1234567800; $i <= 124000000; $i++) {
     see_if_url_exists("$i.php");
 }

对于($i=1234567800;$i是的,它是完全易受攻击的。在
$\u文件
中,以下参数受用户控制:

['type']
['name']
伪造上传并允许以下情况,这绝非小事:

['type'] = 'image/jpeg';
['name'] = 'nasty_hacking_script.php';
由于您允许用户定义的文件扩展名通过您的系统,并且只需执行一个简单的基于时间的重命名,因此最终会出现以下情况

 1234567890.php
如果名称是基于时间的,攻击者也可以简单地戳一下您的服务器并猜测上载的确切时间,例如

 for($i = 1234567800; $i <= 124000000; $i++) {
     see_if_url_exists("$i.php");
 }

用于($i=1234567800;$i从未将用户上传的文档放在您站点的文档根目录中。从未让用户指定文件名。从未信任用户发送的内容类型或任何其他内容。如果您做了这三件事,您就被涵盖了。基本上@Brad是对的,在上载客户端文件时从未信任用户。至少您是对的在服务器端,我看到一些自鸣得意的开发人员依赖客户端文件类型验证,认为这将阻止人们做一些恶意的事情,而事实上,任何知道如何使用Chrome的Inspect元素的人都可以完全绕过它。将上传文件的权限设置为只读也会有所帮助。用户永远不会执行在你的机器上创建一个文件。除了Brad所说的,我通常会设置一个虚拟临时文件夹,在其中移动附加到当前用户的唯一ID(nonce)的文件然后,当他们提交表单时,您验证nonce是否匹配,并将文件移动到最终位置。最后,您设置了一个cron作业,以每24-48小时删除temp中的文件。切勿将用户上载的文档放在站点的文档根目录中。切勿让用户指定文件名。切勿信任内容类型或用户发送的任何其他内容。如果你做了这三件事,你就被涵盖了。基本上@Brad是对的,在上传客户端文件时千万不要相信用户。至少你在过滤服务器端,我见过一些自鸣得意的开发人员,他们依赖客户端文件类型验证,认为这将阻止人们做一些恶意的事情,而事实上任何人都知道h如何使用Chrome的Inspect元素可以完全绕过它。将上传文件的权限设置为只读也会有帮助。用户永远不会在您的计算机上执行文件。除了Brad所说的,我通常会设置一个虚拟临时文件夹,在其中移动附加到当前用户的唯一ID(nonce)的文件然后,当他们提交表单时,您验证nonce是否匹配并将文件移动到最终位置。最后,您设置了一个cron作业,以每24-48小时删除temp中的文件。亲爱的Marc B他们如何在代码检查文件类型时上载.php文件,如果此代码为:if($_files['fileToUpload']['type']='image/jpeg'|$|$_files['fileToUpload']['type']='image/gif'| |$\u文件['fileToUpload']['type']='image/png'){如果你坦诚地阅读了我的答案,请给我一个解决方案?
['type']
受用户控制,这意味着他们可以伪造任何想要的mime类型。您需要使用服务器端mime类型确定,例如,亲爱的Marc B,当代码检查文件类型时,他们如何上传.php文件,如果此代码为:if($\u FILES['fileToUpload']['type']='image/jpeg'|$\u FILES['fileToUpload']['type']='image/gif'|$\u FILES['fileToUpload']['type']=='image/png'){如果你能坦诚地阅读我的答案,请给我一个解决方案?
['type']
受用户控制,这意味着他们可以伪造任何想要的mime类型。你需要使用服务器端mime类型确定,例如。