zsn

个人站

欢迎来到我的个人站~


htmlentities()与urlencode()

之前做过一段时间php,现在工作需要,再拾起来,翻看php文档,看到htmlentities()与urlencode()两个方法,对使用场景做下总结。

HttpEntity

在html中有些字符是预留的,(比如,< 和> 会被渲染为标签,&nbsp代表空格等等)。若对这些不进行处理,可能得不到预期的显示,或者导致XSS漏洞。所以对于在html上呈现的内容,要根据情况使用htmlentities()转码,比如用户通过输入框提交的内容,都需要处理下,切记不要信任用户输入

字符实体的表示方法:

  • &entity_name;
  • &#entity_number;

比如,需显示小于号,我们必须这样写:

&lt;&#60;

空格&nbsp; 浏览器总是会截短 HTML 页面中的空格。如果在文本中写 10 个空格,在显示该页面之前,浏览器会删除它们中的 9 个。如需在页面中增加空格的数量,就需要使用 &nbsp;字符实体。 完整的实体符号,可以参看HTML实体符号参考手册

Url Encode

这个问题涉及到URL的定义,URL是为了统一的命名网络中的一个资源(URL不是单单为了HTTP协议而定义的,而是网络上的所有的协议都可以使用)。因为一些历史的原因URL设计者使用US-ASCII字符集表示URL。(原因比如ASCII比较简单;所有的系统都支持ASCII)为了满足URL的以上特性,设计者就将转义序列移植了进去,来实现通过ASCII字符集的有限子集对任意字符或数据进行编码。URL转义表示法包含一个百分号,后面跟上两个表示字符ASCII码的十六进制数值,比如%E4。

不同的编程语言对于URL的转义还不太一样,比如: java URLEncoder php urlencode

具体参见Wikipedia

所以

  • 对于用户通过网页提交的数据,使用html entities进行转意,因为这些数据将来很可能会再次被呈现在网页上,避免xss;
  • 对于构造url,使用url encode进行转意,因为这是大家通用的标准;