代码之家  ›  专栏  ›  技术社区  ›  netrox

为什么php不能把引号转换成mysql的html实体呢?

  •  3
  • netrox  · 技术社区  · 17 年前

    默认情况下,PHP使用“magicQuotes”,但它受到了很多抨击。我知道它将在下一个主要版本的PHP中禁用它。

    尽管反对它的论点是有道理的,但我不明白的是,为什么不使用HTML实体来表示引号,而不剥离和删除斜线?毕竟,绝大多数mysql都是用来输出到web浏览器的?

    例如,使用&039;而不是'

    另一个问题是,为什么php不能只为每个版本的php设置带有此标记的配置?PHP4或?php5是否可以为这些版本加载适当的解释程序?

    只是好奇而已。:)

    6 回复  |  直到 14 年前
        1
  •  5
  •   zombat    17 年前

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

    你似乎在假设只有单引号和双引号的字符会造成问题。mysql查询实际上容易受到 \x00 ,请 \n ,请 \r ,请 \ ,请 ' ,请 " 和 \x1a 数据中的字符。如果您没有使用准备好的语句或 mysql_real_escape_string() ,则存在SQL注入漏洞。

    HTML特殊字符() 和 HTMLN() 不要转换所有这些字符,因此使用这些函数不能保证查询的安全。为此, addslashes() 也不能保证您的查询安全!

    其他较小的缺点包括其他海报已经提到的关于mysql的内容,而不是 总是 用于Web内容,以及增加数据所需的存储量和索引空间(考虑一个引号字符存储一个字节,而实体形式存储六个或更多字节)。

        2
  •  9
  •   Bill Karwin    17 年前

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

    最好在输出时退出输出。这是您唯一一次确定输出将指向网页,而不是日志文件、电子邮件或其他目标。

    ps:php已经在标准php.ini文件中默认关闭了magic引号。它在php 5.3中已被弃用,将在php 6.0中从语言中完全删除。

        3
  •  2
  •   Noon Silk    17 年前

    我只回答你的第一个问题。

    验证 输入 不管怎样,这是一个错误的方法,因为重要的不是输入,问题在于它的使用位置。PHP不能假定MySQL查询的所有输入都将输出到HTML实体有意义的上下文中。

    很高兴看到magic_引号的出现;这是导致PHP出现大量安全问题的原因,很高兴看到他们采用了新的方法:)

    如果您重新构造验证方法以在输出上进行验证,那么对于您正在工作的上下文,您将获得极大的帮助。只有作为程序员的你才能知道这一点。

        4
  •  1
  •   nickf    17 年前

    MySQL不转换的原因 ' 到 ' 是因为 &α039; 不是 ’ . 如果要将数据转换为输出,则应该在视图层进行转换,而不是在数据库中进行转换。打电话真的不难 htmlentities 回音前/回音时。

        5
  •  0
  •   netrox    17 年前

    谢谢大家。我真的必须想一想,如果我把引号改成HTML实体而不是在实体上加斜杠,这意味着什么,也可能意味着什么,但是,这不是真的也改变了输出/输入吗?

    我想不出为什么我们不能或不应该为MySQL使用HTML实体的原因,只要我们清楚地表明所有数据都是使用HTML实体编码的。毕竟,我的论点是基于这样一个事实,即大多数MySQL都用于输出到HTML浏览器,而且“和”和/可能严重损害MySQL数据库。所以,在将“和”和/作为HTML实体发送为插入查询之前,对它们进行编码是否更安全?另外,我们将使用XML,那么为什么在访问已经在HTML实体中编码的数据时浪费时间编写HTMLEntities、StripSlashes和AddSlashes呢?

        6
  •  0
  •   DisgruntledGoat    17 年前

    你不能只是转换 ' 到 ' . 想想看:当你想存储字符串时会发生什么? &α039; “?如果你储存 &α039; 然后当您加载页面时,它将显示 ’ 而不是 &α039; .

    所以现在您必须转换所有HTML实体,而不仅仅是引号。然后你开始陷入各种奇怪的转换问题。最简单的解决方案是 存储真实数据 在数据库中,您可以按自己的喜好显示它。您可能需要使用实际的引号-在大多数情况下 " 和 ’ 不要在标签支架外做任何伤害。

    有时,您可能希望将实际的HTML存储在一个字段中并将其原始显示(只要在进出时对其进行了检查和清理)。

    推荐文章