什么是最安全的PHP文件上传方法,可以处理所有文件类型?

时间:2015-05-23 21:02:17

标签: php security file-upload

我正在尝试开发一个小型社交网络,并想知道以下方法是否足以使我的“文件上传处理脚本”尽可能安全。我的目标是允许我的用户上传图像[jpeg,jpg,png,gif],视频[3gp,wma,mp4]和mp3文件。我在SO处经历了许多问题,但大多数问题似乎都是处理图片上传的细节而不是视频和mp3。我想知道我还能做些什么来使脚本成为可用的msot安全上传脚本。 [是的,我对安全性非常偏执,并且肯定希望我的网站以其安全而不是速度而闻名]。 我目前的做法如下:

  • 检查用户是否已注册(通过查看会话)
  • 检查文件是否上传没有错误
  • 检查文件大小是否在允许的范围内
  • 清理文件名
  • 获取文件扩展名并检查它是否为允许的扩展名
  • 获取mime类型并检查它是否是允许的mime类型
  • 生成新的随机文件名
  • 为public_html之外的文件夹设置.htaccess规则并使用它 存储上传的文件
  • 使用move_uploaded_file()
  • 使用chmod()将'0644'设置为上传文件的权限

在.htaccess文件中,将添加以下内容:

 SetHandler none
    SetHandler default-handler
    Options -ExecCGI
    php_flag engine off

ForceType application/octet-stream
<FilesMatch "(?i)\.jpe?g$">
    ForceType image/jpeg
</FilesMatch>
<FilesMatch "(?i)\.gif$">
    ForceType image/gif
</FilesMatch>
<FilesMatch "(?i)\.png$">
    ForceType image/png
</FilesMatch>
<FilesMatch "(?i)\.mp3$">
    ForceType audio/mpeg
</FilesMatch>
<FilesMatch "(?i)\.mp4$">
    ForceType video/mp4
</FilesMatch>

我正在尝试的代码如下:

$fileInput = $_FILES['image'];
$sizeLimit="4000";
if($fileInput['error'] === UPLOAD_ERR_OK && isset($fileInput['tmp_name'])){
if($fileInput['size'] < $sizeLimit){
$cleanedName=stripslashes($fileInput['name']); //cleaning file name
$checking = pathinfo($cleanedName); //finding extension
$ext=$checking['extension'];
$finfo = finfo_open(FILEINFO_MIME_TYPE); // find mime type
$mimetype =  finfo_file($finfo, $fileInput['tmp_name']);
finfo_close($finfo);
.
.
.//generate random name and use move_uploaded_file() and chmod()
}
}

这种方法是否足以保证我的网站安全,或者这种方法存在一些明显的缺陷?在此先感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

建议检查文件扩展名,但要注意mime类型很容易被欺骗,因此这不是一个很好的安全检查。

到目前为止你所拥有的是好的,我的额外提示是:

  • 病毒扫描所有上传内容 - 这更多是为了保护应用程序的其他用户而不是服务器。
  • 完全将图像存储在Web根目录之外,并使用an approach such as this one代理要提供的文件。这样做的好处是可以在代码中执行任何额外的权限检查(因此Bob无法下载Alice的文件),并且当文件作为数据访问时,就没有机会执行。
  • 使用X-Content-Type-Options: nosniff标头提供文件,以防止通过IE浏览器进行任何XSS攻击。
  • 使用服务器生成的名称存储图像。例如,您可以在其数据库条目的主键之后命名每个文件。这将减轻任何directory traversal攻击(like this one),如果用户设法上传恶意内容,他们就不太可能在服务器上找到它。
  • 将所有图片加载到图片库中并重新保存,以确保他们没有exploits embedded for popular browsers
  • 使用某种手动监控系统来监控任何上传的非法内容。
  • 保护您的表单免受CSRF
  • 的影响