用户上传/下载的文件名允许的字符


allowed characters for filenames for user upload/download

目前用户可以根据需要上传文件。因此,在上传的文件中有空格,ß, ü等字符。比其他人可以下载这些文件(包括URL中的空格等)。它以这种方式工作,但根据RFC1738 - 统一资源定位符 (URL) 只允许字母数字字符[a-zA-Z0-9]和一些特殊/保留字符。我认为也应该避免空白。

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

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

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

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

如果您打算通过 PHP 提供带有 Content-Disposition 标头的文件,则应只允许文件名中的 followinig 字符:

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

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

通常,当上传文件时,它的文件名会规范化。在上传时进行一些验证/消毒也是明智的。

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

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

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

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

用户上传后,我应该重命名服务器上的文件吗?

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

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