默认情况下,PHP使用“魔术引号”但是它已经有很多瑕疵。我知道它将在下一个主要版本的PHP中禁用它。
虽然反对它的论据是有道理的,但我不明白为什么不只是使用HTML实体来代表引号而不是剥离和删除斜杠?毕竟,VAST的大部分mySQL用于输出到Web浏览器?
例如,'用来代替',它根本不会影响数据库。
另一个问题,为什么PHP不能只为每个版本的PHP设置配置此标签<?php4或<?php5,因此可以为这些版本加载适当的解释器?
好奇。 :)
答案 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存储在一个字段中并将其显示为原始状态(只要在进/出时检查并清理它。