gpt4 book ai didi

php - 我们应该清理 $_FILES ['filename' ] ['name' ] 吗?

转载 作者:可可西里 更新时间:2023-10-31 22:47:15 25 4
gpt4 key购买 nike

在用户将图像上传到服务器后,我们是否应该清理 $_FILES['filename']['name']

我会检查文件大小/文件类型等。但我不会检查其他内容。是否存在潜在的安全漏洞?

谢谢

最佳答案

绝对!正如@Bob 已经提到的,普通文件名很容易被覆盖。

还有一些问题您可能想要涵盖,例如并非所有 Windows 中允许的字符在 *nix 中都被允许,反之亦然。文件名还可能包含相对路径,并可能覆盖其他未上传的文件。

这是我为 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;
}

重要的部分是:

  1. array_map('basename', ...),这确保文件不包含任何相对路径。
  2. ph()->Text->Slug(),这确保文件名中只允许 .0-9a-zA-Z,所有其他字符替换为下划线 (_)
  3. md5_file(),这是添加到文件名iff另一个同名文件已经存在

我更喜欢使用用户提供的名称,因为搜索引擎可以使用它来提供更好的结果,但如果这对您不重要,则可以使用简单的 microtime(true)md5_file() 可以简化一些事情。

希望对您有所帮助! =)

关于php - 我们应该清理 $_FILES ['filename' ] ['name' ] 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3393627/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com