使用DO_SHORT代码进行转义是安全且良好的做法吗?

时间:2020-01-27 作者:maysi

我们公司正在使用高级自定义字段,有时我们需要在自定义字段中使用shortcode。在php代码中,我们使用do_shortcode 这些字段的函数。没有理由不对大多数字段使用它,因为我们可能希望稍后向字段添加短代码。

我们还将PHP CodeSniffer与WordPress编码标准规则结合使用。无论何时我们使用echo do_shortcode 逃跑警告消失了。那么使用它安全吗do_shortcode 或者我们需要使用例如。wp_kses_post 另外?

在这方面有什么最佳做法吗?

谢谢你的建议

1 个回复
SO网友:Jacob Peattie

WordPress编码标准嗅探处理do_shortcode() 作为“自动转义函数”。2015年,这些GitHub问题中似乎已经讨论了这一点:

https://github.com/WordPress/WordPress-Coding-Standards/issues/167https://github.com/WordPress/WordPress-Coding-Standards/issues/428

将其添加到列表时使用的解释是:

我与VIP支持人员讨论了这一点(#44195)。David在与另一位团队成员商议后表示,这是不必要的,因为我们在HTML发出的地方(在短代码的代码中)进行转义。

但我不确定我是否同意这个推理。如果您这样使用它:

<?php echo do_shortcode( \'[liveperson]\' ); ?>
如果短代码是硬编码的,这是有意义的,因为唯一要转义的是短代码的输出,应该通过短代码回调转义。

然而,在您的情况下,您正在使用do_shortcode() 允许从自定义字段在用户提供的文本中执行短代码。该文本确实需要转义,但是do_shortcode() 不执行任何实际转义。

因此,处理此类字段的安全方法是通过wp_kses()wp_kses_post(), 要删除不允许的标签,请执行do_shortcode() 这样就可以执行短代码,而无需再次转义。

$text = get_field( \'field_name\' );

echo do_shortcode( wp_kses_post( $text ) );
它不会对代码嗅探器报告什么/不报告什么产生任何影响,但至少用户提供的文本是经过清理的。

一个限制是,如果使用esc_html(), 因为这会干扰短代码属性。这种清理也不会阻止用户输入可能影响布局的不平衡标记,这是逃避通常有帮助的一件事。为了解决这个问题,您可以添加force_balance_tags():

$text = get_field( \'field_name\' );

echo do_shortcode( force_balance_tags( wp_kses_post( $text ) ) );

相关推荐

Disable escaping html

我在用SyntaxHighlighter Evolved 突出显示代码示例。E、 g。[csharp] string s = \"text\"; List<int> numbers = new List<int>(); [/csharp] 当我第一次保存它时,没关系,但编辑wordpress时,文本会更改为[csharp] string s = &quot;text&quot;; List&lt;int&am