php: htmlspecialchars vs htmlentities

htmlspecialchars

这个函数的作用是把预定义的字符变成html实体,用W3C上面的例子来解释:

<?php
$str = "This is some <b>bold</b> text.";
echo htmlspecialchars($str);
?>

那么浏览器的展示结果就是这样的:

This is some <b>bold</b> text.

如果不使用htmlspecialchars,那么浏览器的展示效果就是这样的:

This is some bold text.

也就是表示,字符串里面的<b></b>标签被解析了。


上面提到了说htmlspecialchars可以把特殊字符转换成html实体,那么

预定义的字符有:

  • & (和号)成为 &amp
  • " (双引号)成为 &quot
  • ' (单引号)成为 &#039
  • < (小于)成为 &lt
  • > (大于)成为 &gt

那么这个htmlspecialchars到底有什么用呢?——一般应用场景是在有输入框的时候,比如有个“反馈”的输入框,用户可以填写自己的意见。

有时候会在用户的“反馈意见”里面看见一些如<img src=xxx.com/xxx onerror=zyx123>之类的东西。

这个输入框就有可能被黑客拿来进行XSS攻击。

虽说XSS攻击是能够绕过htmlspecialchars的,但是你不进行htmlspecialchars就是你没有安全意识了。╭(╯^╰)╮

关于XSS,会在以后的笔记中写到。


还有另外一个函数htmlentities也可以把预定义的字符转换成HTML实体。

但是htmlentitieshtmlspecialchars是有差别的,htmlspecialchars至转换上面定义的那几个预定义字符,而htmlentities会转换所有的html标记。

推荐使用htmlspecialchars

至于,当有中文时,htmlentities会乱码的问题,有两种解决办法,一种是设置整个页面的header的Content-Type:text/html;charset=utf-8,另一种办法是指定htmlentities的编码,如htmlentities($str, ENT_QUOTES, "UTF-8");在第三个参数里面设置了编码。

使用htmlspecialchars作用在于,当由用户自定义的字符串要展示在浏览器里面的时候,把它当做字符串来看待,浏览器也就不会解析里面的标签。

Show Comments