在回显之前,html 变量应该如何在 php(特别是 WordPress)中准备

How should html variables be prepared in php (and specifically, WordPress) before echoing

关于 PHP,我完全是个新手,所以我怀疑这个问题有一个简单的答案,但我还没有找到。

我正在使用 PHP Code Sniffer 和 WordPress 编码标准来组装一个基本的 wordpress 插件。我遇到的一堆教程代码鼓励按照以下行回应内容:

echo $before_widget . $before_title . $title . $after_title;

哪个 工作 很好,但是哪个 PHP Code Sniffer 在 expected next thing to be an escaping function not $VariableName 的每个变量回显之前发出警告。直觉上,我不想转义这些变量 - 其中包含的 HTML 应该正确呈现,并且很难看出攻击者如何更改实例 $args 对象,其中 $before_widget 等来自引入 XSS 漏洞。但正如我所说,我是 PHP、WordPress 等的新手,我不知道在我得到这些变量之前有什么可以完整访问这些变量。

长话短说:鉴于我希望 HTML 呈现为 HTML(我不想逃避它), 应该如何 我要么准备好它们,使我免受任何我不知道的 XSS 问题的影响,要么通知 PHP Code Sniffer 这些不是用户输入,因此是安全的?

这将阻止警告

$a = "";

$a .= $before_widget; 
$a .= $before_title;
$a .= $title;
$a .= $after_title;

echo $a;

echo $before_widget ."". $before_title ."". $title ."". $after_title;

好的,看起来我想要的答案是在打印之前在输出上使用 wp_kses() 函数。根据documentation,这个

makes sure that only the allowed HTML element names, attribute names and attribute values plus only sane HTML entities will occur in $string

这也使得 PHP Code Sniffer 不再抱怨在没有任何转义的情况下回显刺痛。

如果不深入研究实现,我不能肯定地说这涵盖了所有基础(毕竟,理智的 HTML 实体可以用多种方式解释),但直觉上,感觉就像我可能想对来自外部来源的代码做的事情 - 尽管是可信的 - 以防他们,你知道,由于格式不正确而删除网页。

最终代码看起来像:

$html = '';
$html .= $args['before_widget'];
$html .= $args['before_title'];
$html .= esc_html( $title );
$html .= $args['after_title'];
$allowed_tags = wp_kses_allowed_html( 'post' );
echo wp_kses( $html, $allowed_tags );

请注意,值得注意的是,在我识别 kses 的旅行中,我发现许多地方表明它是一个非常慢的功能来传递内容。就目的而言,这似乎是正确的,但如果有人知道更轻量级的方法,我会听取意见。