【发布时间】:2015-05-23 21:02:16
【问题描述】:
我正在尝试开发一个小型社交网络,并想知道以下方法是否足以使我的“文件上传处理脚本”尽可能安全。我的目标是让我的用户上传图片[jpeg,jpg,png,gif]、视频[3gp,wma,mp4]和mp3文件。我已经在这里解决了许多问题,但其中大多数似乎都在详细处理图片上传,而不是视频和 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()
}
}
这种方法是否足以保证我的网站安全,或者这种方法是否存在一些明显的缺陷?提前感谢您的帮助。
【问题讨论】:
-
如果您想更安全,请确保您有 SSL。关于上传本身,文件只是一个文件,无论其类型如何,较大的文件或特定类型的文件本身并不难或不安全。
-
@GolezTrol 谢谢。是的,我肯定会使用 SSL。我注意到SO上的大多数用户大多建议使用GD来验证上传是否是图像,但是有没有这样的验证方法可以让视频和音频更加确定文件?我的方法是否会留下任何容易被操纵的巨大漏洞?
标签: php security file-upload