【问题标题】:allowed characters for filenames for user upload/download用户上传/下载的文件名允许的字符
【发布时间】:2012-04-17 11:00:47
【问题描述】:

目前用户可以随意上传文件。所以在上传的文件中有空格、ß, ü等字符。比其他用户可以下载这些文件(包括 URL 中的空格等)。它以这种方式工作,但根据RFC1738 - Uniform Resource Locators (URL) 仅允许字母数字字符[a-zA-Z0-9] 和一些特殊/保留字符。我认为也应该避免空白。

目前我在服务器上的文件名中获得了ßß。想要下载文件的用户会从 MySQL 数据库 (utf8_unicode_ci) 中获取正确的字符 (ß),因此可以在服务器上找到该文件。

  • 处理文件名的正确方法是什么?
  • 我应该检查文件名并禁止上传吗?
  • 是否应该在用户上传后重命名服务器上的文件(例如str_replace()urlencode()、...)?

【问题讨论】:

    标签: php html web character filenames


    【解决方案1】:

    只要您的网络服务器负责处理文件下载,请确保它知道文件系统上的编码,并且文件系统与您用于处理上传文件名的字符集兼容.

    只要这里的所有内容都兼容(看起来您使用的是 UTF-8),您就不会遇到任何问题。只需确保在您使用的每个地方(文件系统、网络服务器、数据库服务器、数据库客户端连接、浏览器、上传 POST 请求、提供 HTTP HTML 响应的文件链接等)都正确设置了编码。

    如果您打算通过 PHP 提供带有 Content-Disposition 标头的文件,您应该只允许在文件名中包含以下字符:

    a-z, A-Z, 0-9, _, - , .
    

    这是因为该标头没有针对 US-ASCII 可打印范围之外的字符的工作规范。

    通常在上传文件时,文件名会被标准化。在上传时进行一些验证/清理也是明智之举。

    【讨论】:

    • 如何找出“文件系统和文件系统上的编码与您用于上传文件名的字符集兼容”?是的,应该使用 UTF-8。 Web服务器是Apache,数据库服务器是MySQL 5.0.77,连接设置为SET NAMES utf8,浏览器可以是任何人,上传是通过POSTmultipart/form-data,HTML编码是UTF-8。在 Firebug 中,提供文件链接的 HTTP HTML 响应具有 Content-Type application/x-www-form-urlencoded 但我从未做过任何事情(默认?)。
    • 所以Content-Disposition 不是我想要的。如何对文件名进行规范化和验证?
    • @testing:你可以自己处理字符串。
    • 但是我要替换哪些字符?每种语言都有自己的字符,我不想全部替换。那么有标准的集合/功能吗?还是允许a-z, A-Z, 0-9, _, - , . 走的路?
    • @testing: 你首先会rawurlencode 上传文件名并将其存储在磁盘和数据库中。然后在输出时,由于它是一个带有特殊字符的 URL,你需要再次rawurlencode 它。保重。
    【解决方案2】:

    处理文件名的正确方法是什么?

    您似乎已经在处理它们了;将文件名包装在 rawurlencode 中,然后再将它们放入 URL 参数中以符合规范。

    我应该检查文件名并禁止上传吗?

    不,那只会惹恼您的用户。

    用户上传后是否应该重命名服务器上的文件?

    这可能是个好主意。您可以使用您选择的技术生成一个“随机”名称,并将“原始”名称保存在数据库中。每当用户想要下载文件时,通过Content-Disposition HTTP 标头将其返回给他们,并使用他们上传文件时使用的名称。

    这样做的好处包括确保您不会被每个用户的文件系统和服务器文件系统之间的细微差异所困扰,并避免重复文件名问题。

    【讨论】:

    • “您似乎已经在处理它们”是什么意思?我只将它们移动到另一个位置并将原始文件名保存在数据库中。内容配置是否适用于所有浏览器?是否应该只通知用户使用字母数字字符?随机名称的生成是否对 SEO 不利?目前的情况什么时候会导致问题(它有效,但为什么)?
    猜你喜欢
    • 2017-06-08
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    • 2020-06-04
    • 2011-06-16
    • 2018-12-15
    • 2010-10-15
    • 2014-02-26
    相关资源
    最近更新 更多