2009-08-26 71 views
3

默认情况下,PHP使用“魔术引号”,但它已经得到了很多声音。我知道它会在下一个主要版本的PHP中禁用它。为什么不能只是将报价转换为MySQL的HTML实体?

虽然反对它的论点是有道理的,但我不明白为什么不仅仅使用HTML实体来表示引号而不是剥离和删除斜线?毕竟,mySQL的VAST大部分用于输出到Web浏览器?

例如,'被用来代替',它根本不会影响数据库。

另一个问题,为什么PHP只能为每个版本的PHP设置配置,使用这个标签<?php4或<?php5可以为这些版本加载合适的解释器?

只是好奇。 :)

回答

5

这里有一个很好的理由,大多是为了应对自己发布的答案:使用htmlspecialchars()htmlentities()让您的SQL查询安全。这就是mysql_real_escape_string()的用途。

你似乎在假设它只是引起问题的单引号和双引号字符。 MySQL查询实际上容易受到数据中的\x00\n\r,\,',"\x1a字符的影响。如果您没有使用准备好的语句或mysql_real_escape_string(),那么您有一个SQL注入漏洞。

htmlspecialchars()htmlentities()不能转换所有这些字符,因此,您不能使用这些函数使您的查询安全。为此,addslashes()也不会使您的查询安全!

其他较小的缺点包括什么其他的海报已经提到关于MySQL不总是被用于网页内容,以及事实,你都在增加存储和需要为您的数据索引空间量(考虑一个字节的存储为一个引用字符,与其实体形式的存储的六个或更多个字节)。

+0

谢谢!我现在完全理解! :)从现在起我将使用mysql_real_escape_string()函数。 – netrox 2009-08-27 00:28:47

2

我会回复你的第一个问题。

验证输入无论如何都是错误的方法,因为它不是重要的输入,问题在于它的使用位置。 PHP不能假设所有对MySQL查询的输入都会输出到HTML实体有意义的上下文中。

很高兴看到magic_quotes会去;这是PHP带来的很多安全问题的原因,很高兴看到他们采取新的方法:)

如果您重新验证您的验证方法以验证OUTPUT,上下文你在工作。只有你作为程序员可以知道这一点。

1

MySQL不转换'&#039;是因为&#039;不是'的原因。如果您想要将数据转换为输出,则应该在视图层而不是数据库中执行此操作。在回声之前/之中拨打htmlentities真的不是很难。

9

&#039;放入数据库的字符串列中会很好,如果您使用数据库内容的所有内容都正在输出到网页。但事实并非如此。

最好在输出时逃避输出。这是唯一一次确定输出到网页的时间 - 而不是日志文件,电子邮件或其他目的地。

PS:在标准php.ini文件中,PHP已经默认关闭魔术引号。它在PHP 5.3中不推荐使用,它将在PHP 6.0中完全从语言中删除。

+0

消毒的道路上。然而生(只要显示它,因为我写了这个,PHP 6.0已经完全报废。 – 2010-06-10 07:50:22

0

谢谢大家。如果我将引号改为HTML实体,而不是将斜线添加到它们,但我不得不真的想到你的意思以及它可能会产生的影响,但是这又不是真的改变了输出/输入吗?

我想不出为什么我们不能或不应该使用mySQL的HTML实体,只要我们清楚地表明所有数据都使用HTML实体进行编码。毕竟,我的观点是基于这样一个事实:大多数mySQL被用于输出到HTML浏览器,并且“and”和/会严重损害mySQL数据库,所以,它实际上不是编码安全吗? “和/或作为HTML实体发送之前作为INSERT查询?另外,我们正在使用XML,所以为什么要在访问HTML实体中已编码的数据时,浪费时间编写高质量的小文件和反斜杠以及addslashes?

+1

虽然其他回答者提出了一个关于分离问题的有效观点,但是你的方法是可行的。只要你(和其他人)理解数据库中的数据是以这种方式编码的,一切都会好起来的。想要发送数据的文本电子邮件,只要将HTML实体转换出来就可以了。只要理解好了,就可以了。 不利的一面是MySQL不理解要编码的数据,它是整理,搜索和字符串函数假定某种编码,如UTF8或latin1。当存在实体时,它们的行为不会像你期望的那样。这可以吗? – ndp 2009-08-26 04:39:53

+0

是的,重要的是要*一致*。只要你知道你将如何使用这些数据,并且当你不把它呈现为HTML或XML的时候就计划去处理这些字符串,然后按照你的意愿去做。 – 2009-08-26 05:04:17

+0

重点是你不会在途中编码,你编码的方式OUT。你需要了解这一点,一旦你这样做,你会写更安全的应用程序。 – 2009-08-26 06:39:34

0

您不能只将'转换为&#039;。想想看:当你想存储字符串“&#039;”时会发生什么?如果您存储&#039;,则当您加载页面时,它将显示'而不是&#039;

所以现在你必须转换所有的HTML实体,而不仅仅是引号。然后,你开始陷入各种奇怪的转换问题。最简单的解决方案是只需将真实数据存储在数据库中,然后就可以显示它的样子。您可能需要使用实际的引号 - 在大多数情况下,"'不会在标签括号之外造成任何伤害。

有时你可能需要实际的HTML保存在一个领域,因为它的检查和输入/输出。

相关问题