转义数据
转义 输出是通过删除不需要的数据(例如格式错误的 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>';
无评论