跳转到主要内容

转义数据

转义 输出是通过删除不需要的数据(例如格式错误的 HTML 或脚本标记)来保护输出数据的过程。此过程有助于在向最终用户呈现数据之前保护您的数据。 

大多数 WordPress 函数都会正确准备输出数据,并且不需要额外的转义。

转义函数

WordPress 有许多辅助函数,可用于最常见的场景。

请密切注意每个函数的作用,因为有些函数会删除 HTML,而另一些函数则允许它。您必须使用最适合您所呼应的内容和上下文的功能。你总是在回声的时候想逃跑,而不是之前。

  • esc_html() – 在 HTML 元素包含正在显示的数据部分时使用。这将删除 HTML。
<h4><?php echo esc_html( $title ); ?></h4>
  • esc_js() – 用于内联 Javascript。
<div onclick='<?php echo esc_js( $value ); ?>' />

 

  • esc_url() – 用于所有 URL,包括 HTML 元素的 src 和 href 属性中的 URL。
<img alt="" src="<?php echo esc_url( $media_url ); ?>" />
  • esc_url_raw() – 在数据库中存储 URL 或需要非编码 URL 的其他情况下使用。
  • esc_xml() – 用于转义 XML 块。
  • esc_attr() – 用于打印到 HTML 元素属性中的所有其他内容。
<ul class="<?php echo esc_attr( $stored_class ); ?>">

 

  • esc_textarea() – 使用它对文本进行编码以在文本区域元素内使用。
  • wp_kses() – 用于安全转义所有不受信任的 HTML(帖子文本、评论文本等)。这会保留 HTML。
  • wp_kses_post() – 替代版本 wp_kses()自动允许帖子内容中允许的所有 HTML。
  • wp_kses_data() – 其替代版本 wp_kses()仅允许帖子评论中允许的 HTML。

自定义转义示例

如果您需要以特定方式转义输出,函数wp_kses() (发音为“kisses”)将会派上用场。

此函数可确保输出中仅出现指定的 HTML 元素、属性和属性值,并规范化 HTML 实体。

<?php
echo wp_kses_post( $partial_html );
echo wp_kses(
    $another_partial_html,
    array(
        'a'      => array(
            'href'  => array(),
            'title' => array(),
        ),
        'br'     => array(),
        'em'     => array(),
        'strong' => array(),
    )
); ?>

在此示例中,除 <a>、  <br>、 <em>和 之外的所有标签都<strong> 将被删除。此外,如果 <a> 传递了标记,则转义可确保仅  返回thehref 和 the  。title

总是晚使用escape

最好尽可能晚地进行输出转义,最好是在输出数据时进行。

出于以下几个原因,最好晚点逃跑:

  • 代码审查和部署可以更快地进行,因为一看就可以认为输出是安全的,而不是通过许多行代码来查看它在哪里以及是否已经被转义。
  • 有些东西可能会无意中更改首次投射和输出之间的变量,从而引入潜在的漏洞。
  • 后期转义可以更轻松地进行自动代码扫描,从而节省时间并减少审查和部署时间。
  • 只要有可能,后期转义就会使代码更加健壮并且面向未来。
  • 输出上的转义/转换消除了任何歧义并增加了清晰度(始终为维护者开发)。
// Okay, but not great.
$url = esc_url( $url );
$text = esc_html( $text );
echo '<a href="'. $url . '">' . $text . '</a>';

// Much better!
echo '<a href="'. esc_url( $url ) . '">' . esc_html( $text ) . '</a>';

......除非你不能

有时晚逃是不切实际的。在极少数情况下,输出无法传递到 wp_kses(),因为根据定义,它会删除正在生成的脚本。

_escaped在这种情况下,在创建字符串时始终进行转义,并将值存储在以,  _safe or 为后缀的变量中 _clean (例如, $variable 变为 $variable_escaped or  $variable_safe)。

如果一个函数无法在内部输出并且转义较晚,那么它必须始终返回“安全”HTML。这允许 不需要通过 允许此类标签echo my_custom_script_code(); 的版本传递脚本标签来完成 。wp_kses()

通过本地化逃脱

通常使用 WordPress 本地化功能,例如或 ,而不是用于echo输出数据。_e()__()

这些函数只是将本地化函数包装在转义函数中:

esc_html_e( 'Hello World', 'text_domain' );
// Same as
echo esc_html( __( 'Hello World', 'text_domain' ) );

这些辅助函数结合了本地化和转义:

例子

echo $int;

根据它是整数还是浮点数,  (int)、  absint()、 (float) 都是正确且可接受的。
有时, number_format() 或者 number_format_i18n() 可能更合适。

intval()、 floatval() 是可以接受的,但是是过时的 (PHP4) 函数。

转义 HTML 属性中的任意变量

echo '<div id="', $prefix, '-box', $id, '">';

这应该通过一次调用来转义 esc_attr()
当变量用作属性或 url 的一部分时,最好对整个字符串进行转义,这样变量之前的潜在转义字符将被正确转义。

正确的:

echo '<div id="', esc_attr( $prefix . '-box' . $id ), '">';

错误:

echo '<div id="', esc_attr( $prefix ), '-box', esc_attr( $id ), '">';

注意: wp_create_nonce() 如果在 HTML 属性中使用,则使用创建的随机数也应该像这样转义。

在 HTML 属性中以及其他上下文中转义任意 URL

 

echo '<a href="', $url, '">';

这应该用 转义 esc_url()

正确的:

echo '<a href="', esc_url( $url ), '">';

 

错误:

echo '<a href="', esc_attr( $url ), '">'; 
echo '<a href="', esc_attr( esc_url( $url ) ), '">';

通过以下方式将任意变量传递给 JavaScript wp_localize_script()

wp_localize_script( 'handle', 'name',
	array(
		'prefix_nonce' => wp_create_nonce( 'plugin-name' ),
		'ajaxurl'      => admin_url( 'admin-ajax.php' ),
		'errorMsg'     => __( 'An error occurred', 'plugin-name' ),
	)
);

不需要转义,WordPress 会转义。

在 JavaScript 块中转义任意变量

<script type="text/javascript"> 
    var myVar = <?php echo $my_var; ?> 
</script>

 

$my_var 应该用 转义 esc_js()

正确的:

<script type="text/javascript">
    var myVar = <?php echo esc_js( $my_var ); ?>
</script>

在内联 JavaScript 中转义任意变量

<a href="#" onclick="do_something(<?php echo $var; ?>); return false;">

$var 应该用 转义 esc_js()

正确的:

<a href="#" onclick="do_something(<?php echo esc_js( $var ); ?>); return false;">

转义 HTML 属性中的任意变量以供 JavaScript 使用

<a href="#" data-json="<?php echo $var; ?>">">

$var 应使用 esc_js()json_encode() 或 进行转义wp_json_encode()

正确的:

<a href="#" data-json="<?php echo esc_js( $var ); ?>">

在 HTML 文本区域中转义任意字符串

echo '<textarea>', $data, '</textarea>';

$data 应该用 转义 esc_textarea()

正确的:

echo '<textarea>', esc_textarea( $data ), '</textarea>';

转义 HTML 标签内的任意字符串

echo '<div>', $phrase, '</div>';

 

这取决于是否 $phrase 期望包含 HTML。

  • 如果没有,请使用 esc_html() 或其任何变体。
  • 如果需要 HTML,请使用 wp_kses_post()wp_kses_allowed_html() 或 以及 wp_kses() 您想要允许的一组 HTML 标记。

在 XML 或 XSL 上下文中转义任意字符串

echo '<loc>', $var, '</loc>';

 

正确的:

echo '<loc>', ent2ncr( $var ), '</loc>';