为什么不能只将php转换为mysql的html实体?

时间:2009-08-26 03:52:15

标签: php html html-entities magic-quotes

默认情况下,PHP使用“魔术引号”但是它已经有很多瑕疵。我知道它将在下一个主要版本的PHP中禁用它。

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

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

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

好奇。 :)

6 个答案:

答案 0 :(得分:9)

如果您使用的数据库内容都输出到网页,那么将'放入数据库中的字符串列就可以了。但事实并非如此。

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

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

答案 1 :(得分:5)

这是一个很好的理由,主要是回应您自己发布的答案:使用htmlspecialchars()htmlentities() 使您的SQL查询安全 。这就是mysql_real_escape_string()的用途。

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

htmlspecialchars()htmlentities()不会转换所有这些字符,因此您无法通过使用这些功能来确保查询安全。为此,addslashes()也不会使您的查询安全!

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

答案 2 :(得分:2)

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

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

很高兴看到magic_quotes正在进行;这是PHP导致很多安全问题的原因,很高兴看到他们采用新方法:)

如果您根据自己正在使用的上下文重新设置验证方法以验证OUTPUT,那么您将自己做一件大事。只有您作为程序员才能知道这一点。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

谢谢大家。我必须真的想到你的意思以及如果我将引号更改为HTML实体而不是向它们添加斜杠,它可能会产生什么影响但是,这实际上是不是实际上也改变了输出/输入?

我想不出为什么我们不能或不应该为mySQL使用HTML实体的原因,只要我们明确表示所有数据都是使用HTML实体编码的。毕竟,我的论点是基于一个事实,即大多数mySQL用于输出到HTML浏览器,以及'和'和/可能严重损害我的SQL数据库的事实。所以,它实际上不是SAFER编码'和“和/作为HTML实体在发送它们作为INSERT查询之前?另外,我们要使用XML,以便在访问HTML实体中已经编码的数据时,为什么要浪费时间编写htmlentities和stripslashes以及addslashes?

答案 5 :(得分:0)

您不能只将'转换为'。想一想:当你想存储字符串“'”时会发生什么?如果您存储',那么当您加载页面时,它会显示'而非'

所以现在你必须转换所有HTML实体,而不仅仅是引号。然后你开始陷入各种奇怪的转换问题。最简单的解决方案是将实际数据存储在数据库中,然后您可以按照自己喜欢的方式显示它。您可能希望使用实际引号 - 在大多数情况下"'不会在标记括号外造成任何伤害。

有时您可能希望将实际HTML存储在一个字段中并将其显示为原始状态(只要在进/出时检查并清理它。