主题 : PHP 中的htmlspecialchars 和htmlentities函数
级别: 风云使者
UID: 3
精华: 1
发帖: 5641
威望: 2373 点
铜币: 5668 枚
贡献值: 0 点
好评度: 0 点
在线时间: 5716(时)
注册时间: 2010-06-13
最后登录: 2021-01-11
0楼  发表于: 2018-01-27 10:49

PHP 中的htmlspecialchars 和htmlentities函数

       htmlspecialchars()  Convert special characters to html entities
       htmlentities() Convert all applicable characters to html entities


       PHP的这两个函数的定义非常简明扼要。 前一个是: 转换特殊字符为html实体。  后一个是转换所有适用的字符为html实体

       html entities是什么?

         An HTML entity is a piece of text ("string") that begins with an ampersand (&) and ends with a semicolon (;) . Entities are frequently used to display reserved characters (which would otherwise be interpreted as HTML code), and invisible characters (like non-breaking spaces). You can also use them in place of other characters that are difficult to type with a standard keyboard. (来自MDN)

          HTML entity 是 以(&)开头, 以(;)结尾的一段文字(“字符串") 。 Entities 被用作显示保留字符(否则会被解释为HTML代码) 和看不到的字符(例如不分割的空格). 也可以用于使用键盘输入困难的字符。

           那么什么是html的保留字呢?

           首先一个是HTML entity的开头字符(&),  然后是< 和>, 最后是” 。  这些保留字的用途是<>用来标志HTML文件中的标签, 另外一个",
Interpreted as the beginning and end of an attribute's value. 用uu来标识attribute (属性)值。

           那么, 这个函数用来做什么用途呢?
           从字面上理解, 可以用来消除语言的歧义。 就是程序的原本输输入, 应该按照表面的意思来理解。 也就是输入的内容和输出应该保持一致性。 从应用场景上说, 比如HTML表单收集的用户名称, 公司名称, 应该按照本意的文字, 在其他地方显示。 也应该是显示相关的文字和符号。 而不应该作为程序, 在显示的时候执行。
          而一旦输入的文字,在显示的时候, 被执行,则成为恶意攻击。
          而上述两个转换程序, 就是保证数据被保存及再次显示的时候, 以字面意思来理解,而非以程序语句被执行。
          这两个程序都有3个参数, 第一个是要处理的字符串, 第二个是处理的范围, 第三个是使用的编码。

          后面两个条件如果不满足相关的要求, 可能导致转换失败, 则自然失去了程序的本意。 如果没有后两个条件, 函数不转换单引号, 且php 5.6版本以后都默认是utf8编码。
          另外, 在HTML文本中, 属性值应该使用双引号"" 闭合, 否则可能造成很大意想不到的麻烦。