通过php上传文件时的安全措施


Security measures when uploading files via php

我有一个文件上传脚本,将提供给一般公众(如。不是一个封闭的工作环境),我很关心安全问题:我想允许上传任何文件,每个文件都将被上传到它自己的唯一目录,显然,我无法控制人们是否上传恶意文件,但处理这些文件的最佳方法是什么?

我想到了:

完全删除扩展名,只有在提供文件下载时,才给他们原来的扩展名(因为所有的文件名和位置将保存在db中)

创建一个"安全区域"以禁止在目录中运行多个扩展。

禁止上传"不安全"扩展。

当然问题是:有太多"不安全"的文件扩展名,无法一一计算。可以将文件屏蔽为"安全",尽管它包含一些代码。和许多其他安全风险…

所以…有什么建议吗?

为安全起见:

  1. 限制文件大小
  2. 不要使用任何用户提供的数据作为文件名的一部分来存储文件。通过数据库跟踪上传,并使用相关记录的主键
  3. 存储文件。
  4. 不要将文件放在web可访问的目录中-只允许通过脚本访问。这个脚本可以在下载头文件中填充原始文件名。
  5. 无论在哪里存储文件,都要使用非执行权限存储它们。这意味着在unix系统上最多为0640,在Windows系统上也等同。
  6. 限制上传,以防止用户用最新的夏季大片的模糊版本填充您的系统。限制下载,防止你的网站成为下一个warez的天堂。
  7. 尽可能多地跟踪用户的数据:最少的浏览器ID和IP地址。更好的是,在让它们接近网站的文件处理部分之前,需要某种形式的认证/登录。

如果你所做的一切都是作为一个文件存储,你关心什么?你没有执行这些文件或者以任何方式查看它们,对吗?

文件扩展名与文件的安全性无关。

Edit:您真正要做的是将文件名与完整路径的校验和一起存储在数据库中。然后你的脚本会被传递那个校验和,它会在你的数据库中查找,然后你会以某种方式返回文件。不要使用你的web服务器来提供文件,否则(正如你在下面的评论中所说)你可能会意外地执行一个上传的PHP文件。

只需将它们上传到文档根目录外,并在请求时将它们与php文件一起提供

为了防止服务器端执行,不要将它们放入web可访问的文件夹中,而是使用脚本来处理发送文件。

ie:

<?php
// TODO: acl related stuff
// TODO: Map request to file name
// Send the file as an attachment
header('Content-type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . $givenFileName . '"');
readfile($realFileName);

我想你可以用这种方法使它更安全

1-不要以文件名上传文件(意味着你应该使用md5(rand().time().rand()) ;

更改文件名)

)

2-在字典中添加空白页面用于上传,你可以添加。htaccess来拒绝所有你可以使用read

文件显示或下载图像

3-如果允许使用->,您可以在php中使用rename()将字典重命名为其他名称

4-检查上传大小,并使用@include();隐藏所有路径

5-就像@periklis说的,如果你能把文件保存在你的文档根目录之外,这将会有帮助:)

6-在您降低文件扩展名

后拒绝此扩展名.php , .asp .pl .py .rb .htaccess