【问题标题】:Problem of different encoding of upload filename from mac and windowsmac和windows上传文件名编码不同的问题
【发布时间】:2019-12-19 21:41:27
【问题描述】:

当文件从 Mac 和 Windows 计算机上传时,php 中 $_FILES['file'] 全局变量的编码是不同的。

我正在新更新的 Debian/Apache2 上使用 PHP7 开发一个脚本。它在更新之前工作,但现在无法从 Mac 上传文件。

脚本是接收上传文件,并将文件名存入数据库(MariaDB/mySql)

$filename = "$_FILES['files']";
$sql = "INSERT INTO upload_files (filename) VALUES ('$filename')";

当文件名包含非 ascii 字符(例如 æøå)时,从 Windows 计算机上载文件时会正确执行此查询。但是从Mac上传文件时,编码不同,查询失败:

#1366 - Incorrect string value '\xCC\x8A...' for column filename....

【问题讨论】:

  • INSERT INTO upload_files (filename) VALUES ('$filename')。为什么$_FILES['files'] 周围有引号?你知道那可能是一个数组,对吧?这也容易受到 SQL 注入攻击。您还提到了文件上传的两个索引名称,filesfile,是哪个?
  • 这不是原始代码。我直接写来说明这个问题:当文件从 Mac 和 Windows PC 上传时,文件名的编码不同。 S抱歉写的草率。
  • 警告:尽可能使用prepared statements来避免在查询中注入任意数据并创建SQL injection bugs。在mysqliPDO 中执行这些操作非常简单,其中任何用户提供的数据都使用?:name 指示符指定,稍后使用bind_paramexecute 填充,具体取决于您是哪个使用。
  • 你真的需要改掉无缘无故地把事情串起来的习惯。不要做"$x",只做$x。您的$_FILES 在这里用引号括起来,实际上可能会严重破坏含义。 PHP 不是 bash。

标签: php mysql windows macos encoding


【解决方案1】:

Hex CC8A 是 utf8 表示“上面的组合环”。也许下一个元音?

也许有些东西默认为 latin1 或其他一些非 utf8 编码。很难说是什么,因为它是文件名,而不是表中的数据。

Hex C385Å的utf8,相当于41CC8A,是A加一个环。如果您要使用前者,则可以(如果合适)将其转换为 latin1 字符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-21
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多