我的客户在我的托管服务上使用非常过时的电子商务管理系统。对于该产品,供应商不再提供支持。
简要说明:声称在 LAMP 堆栈下运行的商店网站是由运行在 MS Access 上的旧 Visual Basic Windows 应用程序构建的。用户构建店铺,定义HTML模板,添加产品和分类等。
然后VB exe 构建 PHP 页面(每个模板页面一个)和在 MySQL 上运行的 SQL 脚本。它还通过 FTP 上传所有内容并自行运行安装/升级脚本。
问题
浏览该网站,许多产品的描述在euro
标志前被截断。例如,原本应该是“Product price €1000”的内容变成了“Product price”
分析
- MySQL 在 € 符号之前包含一个被删减的描述,所以这不是 PHP 的错
- Access 数据库包含带有 € 符号的完整描述,因此这不是网站管理员编写错误描述或 eDisplay 剪切它们的错
- 网站上传后将运行的 SQL,上传前存储在我的本地机器上,包含 € 符号
- 同样的脚本,在被 eDisplay 传输到 FTP 并使用 SSH 中的 nano 打开后,显示的 € 符号乱七八糟,如下所示:
^À
- vsftpd 日志报告(为了隐私而混淆)
Sat Dec 15 11:16:57 2012 22 xxx.xxx.128.13 1112727 /srv/www/domains/xxxxxx.it/htdocs/db.sql b _ i r xxxxxxx ftp 0 * c
似乎是二进制传输(也是一个巨大的安全漏洞,因为您可以从未经身份验证的 HTTP 下载整个数据库) - eDisplay 内部 FTP 客户端不提供ascii/二进制传输模式选项
- [添加] 尝试通过 SFTP 手动上传 SQL 文件显示乱码
- [Add2] 尝试使用具有显式 ASCII 模式的 Xftp 客户端手动上传也没有解决
看起来文件是作为二进制文件上传的。也许在客户以前的主机上一切正常,因为那是一台 Windows 主机。
服务器
vsftpd
它是一个运行 openSUSE 12.2的Azure 虚拟机openSSH
问题
没有要求客户使用 FileZilla 手动上传文件或替换€
为€
,因为他拒绝,我可以在服务器端做些什么来防止 vsftpd 搞砸欧元符号?
您可以尝试更改 SQL 文件的编码以及行分隔符。或者您可以将所有符号更改为
€
。部分修复
通过将 MySQL 的默认字符集设置为不同于 UTF-8,我可以正确显示欧元
资源
第一行被注释是因为我的 MySQL 版本无法识别它第三行被注释是因为我在服务器日志上记录的每个连接都出错并且连接被截断(所以每个站点都离线)
我说修复是部分的,因为我绕过 FTP 上传并使用正确的欧元符号将 SQL 直接运行到 phpMyAdmin