安全基础:esc_html / esc_attr / esc_url

作者: admin 分类: wordpress主题制作教程 发布时间: 2026-11-06 18:38

一个“看起来没事”的隐患

caogenbj 原来输出 meta description 是这样写的:

<meta name="description" content="<?php echo $miaoxu; ?>" />

裸输出,没有转义。

如果某篇文章的描述里带双引号(比如“电信”星卡“29元套餐”),输出就变成:

<meta name="description" content="电信"星卡"29元套餐" />

浏览器解析到第二个引号,就认为 content 结束了。后面的内容全成垃圾。用户看到的描述断在第一个引号处。

四个转义函数

函数 用在哪 例子
esc_html() 标签之间的纯文本 <p><?php echo esc_html($x); ?></p>
esc_attr() 标签属性值里 content="<?php echo esc_attr($x); ?>"
esc_url() href / src <a href="<?php echo esc_url($url); ?>">
esc_js() 内联 JS 字符串 很少用

按“位置”选,不要混用。

esc_attr 具体转什么

  • " → &quot;
  • ' → &#039;
  • & → &amp;
  • < > → &lt; &gt;

中文、数字、普通标点都不受影响。所以 99% 的内容转完看起来没变化。

为什么必须转

两个原因:

  1. 防结构破坏:内容里的引号/尖括号会把 HTML 撑破;
  2. 防 XSS:如果内容来自用户输入(评论、搜索词),不转义就是漏洞。

哪怕现在的内容“都是自己写的、不会带引号”,也应该转——因为以后可能会变。

一个诚实的说明

esc_attr 和 esc_html 在 WordPress 源码里实现几乎一样(都转那几个字符)。实际效果没区别。

区分它们主要是语义:让后来看代码的人知道你清楚自己在干什么。另外它们挂的过滤器名字不同,个别插件可能只处理其中一个。

所以还是按位置选,别图省事乱用。

什么时候不用转

输出的是你已经确认安全的 HTML时,不能转——转了就把标签也转成文本了。

比如 the_content() 输出的正文,里面本来就有 <p> <h2>,你不能再 esc_html,否则标签全变成可见的代码。

规则:输出“纯文本”要转义,输出“可信 HTML”不转义。

小结

一句话记住:属性里用 esc_attr,标签之间用 esc_html,链接用 esc_url;纯文本必转,可信 HTML 不转。

下一篇是卷四最后一篇:一份主题体检清单。

本系列导航

相关文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

Powered by 草根站长笔记 © 2015-2026 草根站长笔记 Inc.版权所有,禁止转载