2

我使用 PHP 和 MySQL 制作了一个带有评论的简单新闻系统,它在我的本地 Apache 服务器上运行良好,无论是在我的 Fedora 10 机器上,还是在我的 Windows 7 机器上。现在我有一个问题,我把它上传到一个网络主机,它不断返回所有的'和“作为\'和\”。

我相信这要么是出于安全原因自动添加它们的网络主机,要么是 MySQL 是错误的排序规则,但我还没有能够解决它,测试多个 MySQL 排序规则。

下面是一个查询示例:

mysql_query("INSERT INTO news (title, poster, text, time) VALUES ('$newstitle', '1', '$newstext', '$time')") or die(mysql_error());

$timeistime(); $newstitle$newstextare parsed from$_POST并且两者都mysql_real_escape_string()在我运行查询之前运行(我想这可能是问题,但由于它是安全性的一部分,我只是不想删除它,因为它没有引起问题在我的本地服务器上)

最后一点:在我的本地 apache 服务器上,我latin1_swedish_ci在 web 主机服务器上不起作用。

编辑:

它们在数据库中看起来像这样:

\'\'\'\"\"\"

而在我的本地,他们没有额外的反斜杠,所以它必须是 PHP 添加它。除了添加一个删除多余反斜杠的函数之外,有没有办法解决这个问题?

4

7 回答 7

7

这些额外的反斜杠可能是Magic Quotes。在处理数据之前尝试禁用它们或删除它们。

于 2009-05-14T19:05:10.567 回答
4

编辑:正如下面多次提到的,在评论中,正确的方法是禁用魔术引号。如果我在回答之前完全阅读并理解了这个问题,那可能会更好;)


mysql_real_escape_string()将按照它所说的去做,并转义字符串中的相关字符。转义引号是通过在它们前面加上转义字符(PHP 和许多其他语言中的反斜杠)来完成的。 当您从数据库中拉回数据时,对内容执行类似运行stripslashes()(请参阅PHP 文档)的操作,以删除引号等内容中的斜线。

编辑:正如 Gumbo 提到的,这也可能是由于在服务器上启用了 Magic Quotes。你应该按照他的回答禁用这些。

于 2009-05-14T19:03:13.847 回答
4

不,您不想运行 stripslashes()。相反,正确设置您的服务器。

首先,关闭magic_quotes。这意味着进入脚本的任何数据都不会逃脱。

然后在数据上运行 mysql_real_escape_string() ,这将只为查询添加斜杠,并将数据存储在数据库中而没有斜杠。

再次加载数据时,一切顺利,引号周围不会有任何反斜杠。

于 2009-05-14T19:06:46.147 回答
3

查看您的magic_quotes设置,并在您的服务器上进行比较。您的家庭服务器可能已magic_quotes禁用(应该如此,因为在当前版本的 PHP中不推荐使用 Magic Quotes),并且您的 Web 主机可能已启用它们(可悲的是,这很常见)。您可以使用:

<?php echo phpinfo(); ?>

进行快速比较。

如果你不熟悉magic_quotes,那么在部署你关心的任何东西之前,你可能想多研究一下PHP 安全性。

包含“magic_quotes”的问题

于 2009-05-14T19:13:22.137 回答
2

您的主机可能启用了魔术引号。

于 2009-05-14T19:06:21.373 回答
2

看看magic_quotes_gpc。您可以通过 .htaccess 将其关闭并使用 mysql_real_escape_string()。

于 2009-05-14T19:06:27.647 回答
-1

真正的解决方案是在插入查询中使用准备好的语句。

这是一个顶部有插入示例的站点。

PHP 中的准备好的语句

好处是它是一种最佳实践,副作用是您不再需要担心清除输入以防 SQL 注入攻击。

于 2009-05-14T20:46:22.150 回答