可以处理所有文件类型的最安全 php 文件上传方法是什么?
What is the Most Secure php file upload method that can handle all filetypes?
我正在尝试开发一个小型社交网络,想知道以下方法是否足以让我的 'file upload handling script' 尽可能安全。我的目标是允许我的用户上传图像[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()
}
}
这种方法是否足以保证我的网站安全,或者这种方法是否存在一些明显的缺陷?。预先感谢您的帮助。
建议检查文件扩展名,但请注意 MIME 类型很容易被欺骗,因此这不是一个很好的安全检查。
到目前为止你的内容很好,我的额外提示是:
- 病毒扫描所有上传 - 这更多是为了保护您的应用程序的其他用户,而不是您的服务器。
- 将图像完全存储在网络根目录之外,并使用an approach such as this one 代理要提供的文件。这样做的好处是可以在代码中执行任何额外的权限检查(因此 Bob 无法下载 Alice 的文件)并且由于文件是作为数据访问的,因此没有执行的机会。
- 通过 IE 的 mime 嗅探提供具有
X-Content-Type-Options: nosniff
header to prevent any XSS
攻击的文件。
- 使用服务器生成的名称存储图像。例如,您可以根据其数据库条目的主键来命名每个文件。这将减轻任何 directory traversal attacks (like this one),如果用户确实上传了恶意内容,他们将不太可能在服务器上找到它。
- 将所有图像加载到图像库中并重新保存它们以确保它们没有任何 exploits embedded for popular browsers。
- 建立某种手动监控系统来监视任何上传的非法内容。
- 保护您的表格免受CSRF。
我正在尝试开发一个小型社交网络,想知道以下方法是否足以让我的 'file upload handling script' 尽可能安全。我的目标是允许我的用户上传图像[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()
}
}
这种方法是否足以保证我的网站安全,或者这种方法是否存在一些明显的缺陷?。预先感谢您的帮助。
建议检查文件扩展名,但请注意 MIME 类型很容易被欺骗,因此这不是一个很好的安全检查。
到目前为止你的内容很好,我的额外提示是:
- 病毒扫描所有上传 - 这更多是为了保护您的应用程序的其他用户,而不是您的服务器。
- 将图像完全存储在网络根目录之外,并使用an approach such as this one 代理要提供的文件。这样做的好处是可以在代码中执行任何额外的权限检查(因此 Bob 无法下载 Alice 的文件)并且由于文件是作为数据访问的,因此没有执行的机会。
- 通过 IE 的 mime 嗅探提供具有
X-Content-Type-Options: nosniff
header to prevent anyXSS
攻击的文件。 - 使用服务器生成的名称存储图像。例如,您可以根据其数据库条目的主键来命名每个文件。这将减轻任何 directory traversal attacks (like this one),如果用户确实上传了恶意内容,他们将不太可能在服务器上找到它。
- 将所有图像加载到图像库中并重新保存它们以确保它们没有任何 exploits embedded for popular browsers。
- 建立某种手动监控系统来监视任何上传的非法内容。
- 保护您的表格免受CSRF。