正在转义数据

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


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

正在退出函数

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

请密切注意每个函数的作用,因为有些函数会删除HTML,而其他函数会允许。您必须使用最适合您所回显内容和上下文的函数。你总是想在回应时逃离,而不是在回应之前。

  • esc_html()–只要HTML元素包含正在显示的数据段,就可以使用。这将删除HTML。
<h4><?php-echo eschtml($title);?></h4>
  • esc_js()–用于内联Javascript。
<div onclick='<?php echo escjs($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_数据()–的替代版本wp_kses()只允许在帖子评论中使用HTML。

自定义转义示例

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

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

<?php(电话)echo wp_kses_post($partial_html);回波wp_kses($another_partial_html,阵列(“a”=>数组(“href'=>数组(),“title”=>数组(),),'br'=>数组(),'em'=>数组(),“strong”=>数组(),)); ?>

在此示例中,除<a><br><em>、和<强>将被剥离。此外,如果<a>标记,则转义确保只有href公司以及标题返回。

总是迟到

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

最好是因为以下几个原因而迟到:

  • 代码检查和部署可以更快地进行,因为它可以被认为是一目了然的安全输出,而不是搜索许多行代码来查看它是否已经被转义。
  • 在首次转换变量和输出变量之间,可能会有一些东西无意中改变了变量,从而引入了潜在的漏洞。
  • 延迟转义使自动代码扫描更容易,节省了时间并减少了审阅和部署时间。
  • 尽可能延迟转义可以使代码更健壮,更经得起未来的考验。
  • 转义/投射输出消除了任何歧义并增加了清晰度(始终为维护者开发)。
//好吧,但不太好。$url=esc_url($url);$text=esc_html($text);echo'<a href=“'.$url.'”>'$文本。'</a> ';//好多了!echo'<a href=“'.esc_url($url).'”>'。esc_html($text)。'</a> ';

…除非你不能

有时迟到是不现实的。在少数情况下,输出无法传递给wp_kses(),因为根据定义,它将剥离正在生成的脚本。

在这种情况下,始终在创建字符串时转义,并将值存储在一个变量中,该变量是用_逃脱_安全的_清洁(例如$变量成为$variable_escaped$变量_安全).

如果函数不能在内部输出并延迟转义,则必须始终返回“安全”HTML。这允许echo my_custom_script_code();无需脚本标记通过wp_kses()这将允许使用此类标签。

使用本地化进行转义

而不是使用回声为了输出数据,通常使用WordPress本地化功能,例如_e()__().

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

esc_html_e(“Hello World”,“text_domain”);//与相同echo esc_html(__(“Hello World”,“text_domain”));

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

示例

转义任何使用的数字变量

echo$int;

根据它是整数还是浮点(整数)absint()(浮动)都是正确的,可以接受的。
有时数字格式()数字格式i18n()可能更合适。

整数()浮动()是可以接受的,但是过时的(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),'”>';

注意:nonce是使用创建的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)),'”>';

通过wp_localize_script()将任意变量传递给JavaScript

wp_localize_script('句柄','名称',阵列(“prefix_nonce”=>wp_create_nonce(“插件名称”),“ajaxurl”=>admin_url(“admin-ajax.php”),“errorMsg”=>__(“发生错误”,“插件名称”),));

不需要转义,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 escjs($myvar);?></script>

在内联JavaScript中转义任意变量

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

$变量应该用esc_js().

对的:

<a href=“#”onclick=“do_something(<?php echo esc_js($var);?>);返回false;”>

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

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

$变量应该用esc_js()json_encode()wp_json_encode().

对的:

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

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

echo“<文本区域>”,$data,“</textarea>”;

$数据应该用esc_text区域().

对的:

echo“<文本区域>”,esc_textarea($data),“</textarea>”;

转义HTML标记中的任意字符串

echo“<div>”,$phrase,“</div>”;

这取决于是否$短语应包含或不包含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>”;