WordPress插件开发转义数据转义函数技术问题

WordPress插件开发转义数据、转义函数技术问题

转义 输出是通过剥离不需要的数据(例如格式错误的 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> 传递了标签,转义可确保仅  返回hreftitle

转义执行

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

最好晚点执行,原因如下:

  • 代码审查和部署可以更快地进行,因为一眼就能看出输出是安全的,而不需要搜索多行代码来查看它在哪里以及是否已经被转义。
  • 在变量首次转换和输出之间,某些事情可能会无意中改变变量,从而引入潜在的漏洞。
  • 后期转义使得自动代码扫描变得更容易,节省时间并减少审查和部署时间。
  • 只要有可能,延迟转义就会使代码更加健壮和面向未来。
  • 对输出进行转义/强制转换可消除任何歧义并增加清晰度(始终为维护者开发)。

 

// 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)函数。

转义 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 属性中使用,则使用创建的 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 中转义数据

在构建 WordPress 插件和主题时,数据转义对于安全性至关重要。本文概述了开发人员可以使用的主要函数或方法,以确保其代码正确转义。转义数据是通过剥离任何不需要的数据(例如脚本标签、格式错误的 HTML 和其他不需要的数据)来确保输出安全的过程。这样可以防止这些数据被视为代码或被执行。

转义数据是 WordPress 中安全编码的关键部分,所有 WordPress 开发都应考虑这一点。

值得庆幸的是,WordPress 核心为开发者提供了一套函数或方法,可以用来转义数据。我们只需要根据所使用的数据以及输出位置来选择合适的函数即可。

在这篇文章中,让我们看看可用的功能以及何时使用每个功能。

esc_html()

我们经常会使用一些变量,并希望将其输出到 HTML 元素中。一个很好的例子就是,当你从数据库中检索某个内容的标题,然后希望将其输出到标题标签中。

此时,我们需要确保输出不包含例如关闭标题标签之类的内容。如果包含,它就会关闭标题标签,破坏页面的 HTML 标记。

因此,我们需要对标题中可能包含的所有 HTML 进行转义,以确保 HTML 标记和布局不会中断。这正是该 esc_html() 函数的用武之地。它将确保输出中的所有 HTML 都经过转义,因此不会被视为 HTML。

请看下面的简单示例。

WordPress插件开发转义数据转义函数技术问题-SEO技术-网站营销-短视频推广-海外跨境电商-编程开发教程-跨贸出口贸易中心

wp_kses()

然而,有时你可能希望在 HTML 元素内输出包含特定允许的 HTML。一个很好的例子就是当你在 WordPress 文章或块编辑器中添加内容时。这些内容可能包含图片、段落、粗体文本,当然还有链接。

在这种情况下,我们希望允许特定的 HTML 并禁止我们知道不安全且有可能导致问题的 HTML,例如脚本标签等。

该 wp_kses() 函数允许我们传入我们想要正确转义的字符串(在本例中为帖子内容)、允许的 HTML 元素数组(或预定义集合的名称)和允许的协议数组。

该函数还包含一些包装函数,使其更易于使用。也许最常用、最广为人知的 wp_kses_post() 函数是使用允许的 HTML 和协议来发布帖子内容,而无需指定它们。

这是一个如何使用它的简单示例。

WordPress插件开发转义数据转义函数技术问题-SEO技术-网站营销-短视频推广-海外跨境电商-编程开发教程-跨贸出口贸易中心

 

请注意使用 WordPress 功能 wpautop() 将段落标签添加到 WYSIWYG 字段条目。

esc_url()

我们可能希望将变量输出为 URL,例如 src 图片的属性或 href 链接的一部分。这时,我们需要确保在输出之前对 URL 进行转义并删除不安全的数据。

为此,我们使用 esc_url() 函数来确保结果输出在这些情况下是安全的。例如:

WordPress插件开发转义数据转义函数技术问题-SEO技术-网站营销-短视频推广-海外跨境电商-编程开发教程-跨贸出口贸易中心

 

esc_js()

我们经常需要将一些动态 JavaScript 代码添加到一个变量中,这些变量可能会根据不同的情况而变化。当我们想要将这些 JavaScript 代码内联输出到页面时,需要确保对其进行转义,以避免运行任何不必要的代码。

为此,我们使用名为 的 WordPress 函数 esc_js()。以下是一个简单的示例:

WordPress插件开发转义数据转义函数技术问题-SEO技术-网站营销-短视频推广-海外跨境电商-编程开发教程-跨贸出口贸易中心

 

esc_attr()

任何时候,如果你想将 PHP 输出到 HTML 元素的属性中(除非它是 URL——参见上文),也必须对其进行转义。正确的做法是使用 esc_attr() function。这可以确保输出在属性内部是安全的。

下面是我们在处理类时使用此函数的一个示例。

WordPress插件开发转义数据转义函数技术问题-SEO技术-网站营销-短视频推广-海外跨境电商-编程开发教程-跨贸出口贸易中心

 

esc_textarea()

当您输入数据 textarea 并希望在 HTML 元素内显示已保存的信息 时,此功能具有特定的用例textarea 。

这是一个简单的例子。

esc_html_e() 和 esc_attr_e()

WordPress 还提供了几个包装函数,方便我们转义需要本地化的字符串。这些转义函数本身就包含了本地化函数,因此我们无需嵌套函数。例如:

WordPress插件开发转义数据转义函数技术问题-SEO技术-网站营销-短视频推广-海外跨境电商-编程开发教程-跨贸出口贸易中心

 

这里需要注意的是,这些函数不能与 PHP 变量一起使用,只能与可以翻译的文本字符串一起使用。就是这样!WordPress 中开发者可用的转义函数概览,包含一些简单的代码示例。希望对您有所帮助。

WordPress 插件通常如何存储其数据?

文本、元数据和设置存储在 WordPress 数据库中。插件使用的图像、JS、CSS 等静态文件存储在 plugins 目录中。用户使用插件时上传的文件存储在 wp-content/uploads 目录下的插件专用文件夹中。

顶部