【发布时间】: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 注入攻击。您还提到了文件上传的两个索引名称,files和file,是哪个? -
这不是原始代码。我直接写来说明这个问题:当文件从 Mac 和 Windows PC 上传时,文件名的编码不同。 S抱歉写的草率。
-
警告:尽可能使用prepared statements来避免在查询中注入任意数据并创建SQL injection bugs。在
mysqli和PDO 中执行这些操作非常简单,其中任何用户提供的数据都使用?或:name指示符指定,稍后使用bind_param或execute填充,具体取决于您是哪个使用。 -
你真的需要改掉无缘无故地把事情串起来的习惯。不要做
"$x",只做$x。您的$_FILES在这里用引号括起来,实际上可能会严重破坏含义。 PHP 不是 bash。
标签: php mysql windows macos encoding