禁用PHP魔术引用以消除由mysql_real_escape_string引起的斜杠

时间:2013-01-15 12:36:57

标签: php

我总是从我把mysql_real_escape_string放入的任何变量中得到 \(反斜杠)。例如:

$string = mysql_real_escape_string($_GET['string']);
echo $string; //result : here\'s the text

在我对Google进行了一些研究之后,有人说这个由服务器设置引起的反斜杠已经打开了magic_quotes_gpc。我也有这个配置。我在phpinfo(), magic_quotes_gpc = ON

上看到了

我的问题是......关闭这个magic_quotes_gpc真的安全吗?
因为我使用mysql_real_escape_string来阻止mysql注入。通过关闭magic_quotes_gpc,我担心这会导致我的服务器“不那么强大”。

3 个答案:

答案 0 :(得分:2)

听起来我觉得你需要对这些科目有一些相当基本的学费。你显然已经在互联网上阅读了以下示例,但没有真正理解为什么这些例子正在做他们正在做的事情,或者他们是如何工作的。复制示例而不理解它们并不是一件好事。

所以在核心你需要对这些主题有更深入的了解,这对于这样的网站来说可能太过分了(SO更多的是帮助人们解决具体问题,而不是教他们整个科目,尽管你会学到很多东西浏览网站。)

但是,我会谈谈你的一些观点:

  • Magic Quotes是一个过时的PHP功能;事实上,它已经完全从最新版本的PHP中删除。禁用它将使您的服务器“功能不强”,或任何类型。事实上,建议不要使用它。

  • 所有以mysql_开头的功能也已弃用,不再推荐使用。较新的替代方案是mysqli_xxx()函数或PDO库。如果您正在使用旧函数学习教程,那么您应该找到一个较新的教程。

  • mysql_real_escape_string()函数(以及mysqli / PDO等效函数)旨在向字符串添加斜杠,在该字符串中找到引号字符或其他会导致SQL语句无效的字符。在运行此函数后在字符串中查找斜杠是完全正常和正确的。这称为“转义”字符串(因此是函数的名称)。字符串的“转义”版本只应在构建SQL查询的上下文中使用。

答案 1 :(得分:1)

只要您的代码负责正确转义某些字符串(例如通过调用mysql_real_escape_string()等),您就可以在php.ini中禁用此功能。实际上,您应始终确保将运行环境设置为您需要的参数,方法是调整php.ini或使用.htaccess为特定vhost设置它们。

依赖所有这些magic_...的东西从一开始就被打破了,因为一旦它关闭,你基本上就会遇到问题。通常不被注意,除非你被黑了。

答案 2 :(得分:0)

您期望mysql_real_escape_string做什么?

它正在转义字符串,因此here\'s the text是预期的输出。这与魔法引号无关,它已经转义了字符串,在调用here\\'s the text后将mysql_real_escape_string作为结果。


当然,正如评论中已经提到的那样,您不应该再使用PHP中的MySQL_*系列方法,因为它们是deprecated。请考虑使用MySQLiPDO,以及准备好的陈述。