用户将图像上传到服务器后,我们应该清理$_FILES [‘filename’] [‘name’]吗?
我检查文件大小/文件类型等.但我不检查其他事情.是否存在潜在的安全漏洞?
谢谢 解决方法: 绝对!正如@Bob已经提到的那样,覆盖普通文件名太容易了.
还有一些您可能想要涵盖的问题,例如,* nix中不允许Windows中允许的所有字符,反之亦然.文件名也可能包含相对路径,可能会覆盖其他未上载的文件.
这是我为phunction PHP framework编写的Upload()方法:
function Upload($source, $destination, $chmod = null)
{
$result = array();
$destination = self::Path($destination);
if ((is_dir($destination) === true) && (array_key_exists($source, $_FILES) === true))
{
if (count($_FILES[$source], COUNT_RECURSIVE) == 5)
{
foreach ($_FILES[$source] as $key => $value)
{
$_FILES[$source][$key] = array($value);
}
}
foreach (array_map('basename', $_FILES[$source]['name']) as $key => $value)
{
$result[$value] = false;
if ($_FILES[$source]['error'][$key] == UPLOAD_ERR_OK)
{
$file = ph()->Text->Slug($value, '_', '.');
if (file_exists($destination . $file) === true)
{
$file = substr_replace($file, '_' . md5_file($_FILES[$source]['tmp_name'][$key]), strrpos($value, '.'), 0);
}
if (move_uploaded_file($_FILES[$source]['tmp_name'][$key], $destination . $file) === true)
{
if (self::Chmod($destination . $file, $chmod) === true)
{
$result[$value] = $destination . $file;
}
}
}
}
}
return $result;
}
重要的部分是:
> array_map(‘basename’,…),这可以确保文件不包含任何相对路径. > ph() – > Text-> Slug(),这确保文件名中只允许使用.0-9a-zA-Z,所有其他字符都被下划线(_)替换 > md5_file(),如果已经存在另一个同名文件,则将其添加到文件名中
我更喜欢使用用户提供的名称,因为搜索引擎可以使用它来提供更好的结果,但如果这对你来说不重要,简单的microtime(true)或md5_file()可以简化一些事情.
希望这可以帮助! =) (编辑:北几岛)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|