转义 输出是通过剥离不需要的数据(例如格式错误的 HTML 或脚本标签)来保护输出数据的过程。此过程有助于在将数据呈现给最终用户之前保护数据安全。
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>
传递了标签,转义可确保仅 返回href
和 title
。
最好尽可能晚地进行输出转义,最好是在数据输出时进行。
最好晚点执行,原因如下:
// 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
或 为后缀的变量中_clean
(例如, $variable
变为 $variable_escaped
或 $variable_safe)
。
如果函数无法内部输出且无法延迟转义,则它必须始终返回“安全”的 HTML。这样 echo my_custom_script_code();
一来,就无需将 script 标签传递到 wp_kses()
允许此类标签的版本中。
与使用 输出数据相比echo,通常使用 WordPress 本地化功能,例如_e()
或__()
。
这些函数只是将本地化函数包装在转义函数中:
esc_html_e( 'Hello World', 'text_domain' );
// Same as
echo esc_html( __( 'Hello World', 'text_domain' ) );
这些辅助函数结合了本地化和转义:
esc_html__()
esc_html_e()
esc_html_x()
esc_attr__()
esc_attr_e()
esc_attr_x()
echo $int;
取决于它是整数还是浮点数, (int)、 absint()、 (float) 都是正确且可接受的。
有时, number_format() 或 number_format_i18n() 可能更合适。
intval(), floatval() 是可以接受的,但是是过时的(PHP4)函数。
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 属性中使用,则使用创建的 nonce 也应该像这样进行转义。
在 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 ) ), '">';
通过 wp_localize_script() 将任意变量传递给 JavaScript
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>';
使用esc_xml()或 退出ent2ncr()。
正确的:
echo '<loc>', ent2ncr( $var ), '</loc>';
在构建 WordPress 插件和主题时,数据转义对于安全性至关重要。本文概述了开发人员可以使用的主要函数或方法,以确保其代码正确转义。转义数据是通过剥离任何不需要的数据(例如脚本标签、格式错误的 HTML 和其他不需要的数据)来确保输出安全的过程。这样可以防止这些数据被视为代码或被执行。
转义数据是 WordPress 中安全编码的关键部分,所有 WordPress 开发都应考虑这一点。
值得庆幸的是,WordPress 核心为开发者提供了一套函数或方法,可以用来转义数据。我们只需要根据所使用的数据以及输出位置来选择合适的函数即可。
在这篇文章中,让我们看看可用的功能以及何时使用每个功能。
我们经常会使用一些变量,并希望将其输出到 HTML 元素中。一个很好的例子就是,当你从数据库中检索某个内容的标题,然后希望将其输出到标题标签中。
此时,我们需要确保输出不包含例如关闭标题标签之类的内容。如果包含,它就会关闭标题标签,破坏页面的 HTML 标记。
因此,我们需要对标题中可能包含的所有 HTML 进行转义,以确保 HTML 标记和布局不会中断。这正是该 esc_html() 函数的用武之地。它将确保输出中的所有 HTML 都经过转义,因此不会被视为 HTML。
请看下面的简单示例。
然而,有时你可能希望在 HTML 元素内输出包含特定允许的 HTML。一个很好的例子就是当你在 WordPress 文章或块编辑器中添加内容时。这些内容可能包含图片、段落、粗体文本,当然还有链接。
在这种情况下,我们希望允许特定的 HTML 并禁止我们知道不安全且有可能导致问题的 HTML,例如脚本标签等。
该 wp_kses() 函数允许我们传入我们想要正确转义的字符串(在本例中为帖子内容)、允许的 HTML 元素数组(或预定义集合的名称)和允许的协议数组。
该函数还包含一些包装函数,使其更易于使用。也许最常用、最广为人知的 wp_kses_post() 函数是使用允许的 HTML 和协议来发布帖子内容,而无需指定它们。
这是一个如何使用它的简单示例。
请注意使用 WordPress 功能 wpautop() 将段落标签添加到 WYSIWYG 字段条目。
我们可能希望将变量输出为 URL,例如 src 图片的属性或 href 链接的一部分。这时,我们需要确保在输出之前对 URL 进行转义并删除不安全的数据。
为此,我们使用 esc_url() 函数来确保结果输出在这些情况下是安全的。例如:
我们经常需要将一些动态 JavaScript 代码添加到一个变量中,这些变量可能会根据不同的情况而变化。当我们想要将这些 JavaScript 代码内联输出到页面时,需要确保对其进行转义,以避免运行任何不必要的代码。
为此,我们使用名为 的 WordPress 函数 esc_js()。以下是一个简单的示例:
任何时候,如果你想将 PHP 输出到 HTML 元素的属性中(除非它是 URL——参见上文),也必须对其进行转义。正确的做法是使用 esc_attr() function。这可以确保输出在属性内部是安全的。
下面是我们在处理类时使用此函数的一个示例。
当您输入数据 textarea 并希望在 HTML 元素内显示已保存的信息 时,此功能具有特定的用例textarea 。
这是一个简单的例子。
WordPress 还提供了几个包装函数,方便我们转义需要本地化的字符串。这些转义函数本身就包含了本地化函数,因此我们无需嵌套函数。例如:
这里需要注意的是,这些函数不能与 PHP 变量一起使用,只能与可以翻译的文本字符串一起使用。就是这样!WordPress 中开发者可用的转义函数概览,包含一些简单的代码示例。希望对您有所帮助。
文本、元数据和设置存储在 WordPress 数据库中。插件使用的图像、JS、CSS 等静态文件存储在 plugins 目录中。用户使用插件时上传的文件存储在 wp-content/uploads 目录下的插件专用文件夹中。