gpt4 book ai didi

php - 图像 URL 中的 unicode 字符 - 404

转载 作者:行者123 更新时间:2023-11-27 23:25:04 24 4
gpt4 key购买 nike

我正在尝试打开名称中包含拉丁字符的图像 (113_Atlético Madrid)。

我通过使用 PHP 函数 rawurlencode() 对其名称进行编码来保存它,因此现在它的新名称是 113_Atl%C3%A9tico%20Madrid。但是当我尝试通过此 URL 打开它时,例如 mysite.com/images/113_Atl%C3%A9tico%20Madrid.png 我收到 404 错误。

我该如何解决这个问题?

PHP代码:

if(isset($_FILES['Team'])){
$avatar = $_FILES['Team'];
$model->avatar = "{$id}_".rawurlencode($model->name).".png";
if(!is_file(getcwd()."/images/avatars/competitions/{$model->avatar}")){
move_uploaded_file($avatar['tmp_name']['avatar'], getcwd()."/images/avatars/teams/{$model->avatar}");
}
}

最佳答案

%-编码用于 URL。文件名不是 URL。您使用的形式:

http://example.org/images/113_Atl%C3%A9tico%20Madrid.png

在 URL 中,Web 服务器会将其解码为类似于以下内容的文件名:

/var/www/example-site/data/images/113_Atlético Madrid.png

当您准备将文件名放入 URL 时,您应该使用 rawurlencode(),但您不应该使用它来准备用于光盘存储的文件名。

这里还有一个额外的问题,即在磁盘上存储非 ASCII 文件名是跨平台不可靠的。特别是如果您在 Windows 服务器上运行,move_uploaded_file() 等 PHP 文件 API 很可能会使用您不想要的编码,并且您最终可能会得到类似 113_Atlà 的文件名©tico Madrid.png.

这个问题不一定很容易解决,但您可以使用任何形式的编码,甚至是 %-encoding。因此,如果您坚持使用当前的 rawurlencode() 来制作文件名:

/var/www/example-site/data/images/113_Atl%C3%A9tico%20Madrid.png

那没问题,但您随后必须使用双 rawurlencode 来生成匹配的 URL:

http://example.org/images/113_Atl%25C3%25A9tico%2520Madrid.png

但无论如何,将潜在用户提供的任意字符串作为文件名的一部分包含在内是非常危险的。您可能会对目录遍历攻击持开放态度,其中名称包含类似 /../../ 的字符串以访问目标目录之外的文件系统。 (而且这些攻击通常会升级为针对通常在弱权限下部署的 PHP 应用程序执行任意代码攻击。)您最好使用完全合成的名称,正如@MatthewBrown 所建议的 (+1)。

(请注意,这仍然不是允许用户文件上传的安全问题的终结,事实证明这是一个非常难以正确使用的功能。内容嗅探和允许图像文件的插件仍然存在问题被重新解释为其他类型的文件,导致跨站点脚本问题。为了防止出现这种情况的所有可能性,最好只提供来自单独主机名的用户提供的文件,这样针对该主机的 XSS 就不会得到你针对主站点的 XSS。)

关于php - 图像 URL 中的 unicode 字符 - 404,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38978495/

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