1

所以我有一个非常简单的应用程序,将数据存储在 MySQL 数据库中,数据被发布到 php 文件中,然后将其包装在 mysql_escape_string() 中,然后将其插入数据库。

在我本地安装的运行 php 和 mysql 的 apache 上,它工作正常,但在我的主机帐户上,它存储任何 ' 和 " 前面带有 \ 的字符。两个数据库都使用相同的 latin1_swedish_ci 字符集,并且都运行相同版本的 mysql:5.5 .27 但显然表现不同。

我对此一无所知。谢谢!

4

1 回答 1

2

正如@njk 评论的那样,您的托管服务提供商很可能在他们的 PHP 环境中启用了魔术引号。因此,当您的代码看到它们时,PHP 请求参数已经包含转义。然后,您使用 mysql_real_escape_string() 将转义应用于“\”转义字符,结果是文字“\”字符最终出现在您的数据库中。

您可以通过上传一个快速的 PHP 脚本来验证您的托管 PHP 环境中的当前设置,该脚本检查get_magic_quotes_gpc()并根据结果打印“是”或“否”。您还可以检查来自phpinfo()的报告。

一般来说,您应该始终将您的开发环境与您的托管环境的 PHP 版本和 PHP 设置相匹配,这样您就可以更加确信地测试您的代码,确保在部署时它会以相同的方式工作。

另一种解决方案是编写您的应用程序以在运行时有条件地撤消魔术引号(如果启用了魔术引号)。然后像往常一样应用 mysql 转义。这是一个 PHP 代码示例的链接,用于在运行时撤消魔术引号:http: //php.net/manual/en/security.magicquotes.disabling.php

第三条建议是更换托管服务提供商。一个还没有启用多年前已弃用的 PHP 功能的好人。没有任何借口!

于 2013-02-08T20:15:35.707 回答