我正在开发一个小型社交网络,想知道以下方法是否足以使我的“文件上传处理脚本”尽可能安全。我希望允许用户上传图片 [jpeg、jpg、png、gif]、视频 [3gp、wma、mp4] 和 mp3 文件。我已经阅读了许多在 SO 上的问题,但大部分似乎只详细涉及图像上传,而不是视频和 mp3。我想知道还有什么更多的措施可以使脚本成为最安全的上传脚本。[是的,我对安全非常担心,肯定希望我的网站以其安全性而不是速度而闻名]。
我目前的做法如下:
我将尝试的代码如下:
这种方法足以保护我的网站安全吗?还是这种方法存在明显的缺陷?感谢您的帮助。
我目前的做法如下:
- 检查用户是否已注册(通过检查会话)
- 检查文件是否没有错误地上传
- 检查文件大小是否在允许范围内
- 清理文件名
- 获取文件扩展名并检查它是否是允许的扩展名
- 获取 MIME 类型并检查它是否是允许的 MIME 类型
- 生成新的随机文件名
- 设置 .htaccess 规则用于存储上传的文件到 public_html 外的文件夹中
- 使用 move_uploaded_file()
- 使用 chmod() 将 '0644' 设置为上传文件的权限
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()
}
}
这种方法足以保护我的网站安全吗?还是这种方法存在明显的缺陷?感谢您的帮助。