在 WordPress 中,esc_* 系列函数是用于数据验证和安全过滤的核心工具,主要作用是防止 XSS 攻击、SQL 注入等安全问题,确保输出到页面或数据库的数据是安全的。这些函数根据使用场景的不同,分为不同的类型,以下是常用 esc_* 函数的详细介绍:
一、输出到 HTML 标签属性中:esc_attr()
- 作用:用于过滤输出到 HTML 标签属性(如
class、id、value等)中的内容,避免属性值中的特殊字符破坏 HTML 结构或引发 XSS。 - 处理逻辑:将特殊字符(如
&、<、>、"、'等)转换为 HTML 实体(如&、<等)。 - 示例:
<input type="text" name="username" value="<?php echo esc_attr( $username ); ?>">
二、输出到 HTML 内容中:esc_html()
- 作用:用于过滤直接输出到 HTML 标签之间的文本内容(非属性),确保文本中的 HTML 标签被转义,不会被浏览器解析执行。
- 处理逻辑:将 HTML 标签和特殊字符转换为实体,仅保留纯文本显示。
- 示例:
<h1><?php echo esc_html( $title ); ?></h1>
<!-- 如果 $title 是 "<script>alert('xss')</script>",会被转义为纯文本显示 -->
三、输出 URL 地址:esc_url()
- 作用:用于过滤 URL 地址(如链接
href、图片src等),确保 URL 格式合法且安全。 - 处理逻辑:
- 仅允许合法的协议(默认:
http、https、ftp、ftps、mailto、news、irc等)。 - 移除危险字符(如空格、控制字符),转义特殊字符。
- 空值或非法 URL 会返回空字符串。
- 仅允许合法的协议(默认:
- 示例:php
<a href="<?php echo esc_url( $url ); ?>">链接</a>
<img src="<?php echo esc_url( $image_url ); ?>" alt="图片">
- 扩展函数:
esc_url_raw():与esc_url()功能相同,但不转义 HTML 实体,适合用于数据库存储或 PHP 内部处理 URL(而非直接输出到页面)。
四、输出 JavaScript 代码中的变量:esc_js()
- 作用:用于过滤在 JavaScript 代码中输出的 PHP 变量,防止变量中的特殊字符破坏 JS 语法或引发 XSS。
- 处理逻辑:转义引号、换行符、控制字符等,确保变量能安全嵌入 JS 中。
- 示例:
<script> var username = "<?php echo esc_js( $username ); ?>"; </script>
五、输出到属性中的 URL(特定场景):esc_url_attr()
- 作用:专门用于过滤 HTML 标签属性中的 URL(如
href、src的属性值),是esc_url()和esc_attr()的结合体。 - 逻辑:先通过
esc_url()验证 URL 合法性,再通过esc_attr()转义属性中的特殊字符。 - 示例:
<a href="<?php echo esc_url_attr( $url ); ?>">链接</a> <!-- 等同于 echo esc_attr( esc_url( $url ) ) -->
六、翻译相关的转义:esc_html__()、esc_html_e()、esc_attr__()、esc_attr_e()
这些函数是翻译函数与转义函数的组合,用于在多语言场景下安全输出翻译后的文本:
esc_html__():先翻译文本(__()),再用esc_html()转义(返回结果,需echo)。esc_html_e():翻译 +esc_html()转义 + 直接输出(无需echo)。esc_attr__():先翻译(__()),再用esc_attr()转义(返回结果)。esc_attr_e():翻译 +esc_attr()转义 + 直接输出。
示例:
<!-- 翻译"欢迎"并安全输出到HTML内容中 -->
<p><?php echo esc_html__( 'Welcome', 'textdomain' ); ?></p>
<!-- 翻译"提交"并安全输出到按钮value属性中 -->
<input type="submit" value="<?php esc_attr_e( 'Submit', 'textdomain' ); ?>">
七、其他实用转义函数
wp_kses():严格过滤 HTML 标签和属性,只允许指定的标签(如<p>、<a>)和属性(如href)通过,适合处理用户输入的富文本(如评论、文章内容)。示例:echo wp_kses( $user_content, wp_kses_allowed_html( 'post' ) );(允许文章中常见的 HTML 标签)。sanitize_text_field():清理文本字段,移除标签、转义特殊字符,适合处理表单提交的文本(如用户名、标题)。sanitize_email():验证并清理邮箱地址,非法邮箱返回空。sanitize_url():类似esc_url(),但更侧重清理 URL(用于数据库存储时推荐)。
使用原则
- 输出位置决定函数:根据数据输出的场景(HTML 内容、属性、URL、JS 等)选择对应的函数。
- “晚过滤,早验证”:数据输出到页面时必须过滤,接收用户输入时(如表单提交)需先验证合法性。
- 避免过度转义:重复转义可能导致内容显示异常(如 URL 被多次编码)。
合理使用这些函数可以大幅提升 WordPress 网站的安全性,尤其是用户可输入内容的场景(评论、表单、自定义字段等)。

Comments NOTHING