不理解→规则4:确保数据安全与上下文有关

时间:2016-10-28 作者:The WP Intermediate

有一个关于TutsPlus的教程→https://code.tutsplus.com/articles/data-sanitization-and-validation-with-wordpress--wp-25536

第4条规则:确保数据安全与上下文有关

他们说这是一个完全安全的HTML

<textarea name="my-textarea"></textarea> Hello World
这是完全有效且安全的HTML–但是,当您单击“保存”时,我们发现文本已跳出文本区域。HTML代码作为textarea的值不安全:

稍后你会发现它们相互矛盾。然而,他们没有提供为什么它是安全的,那么在wordpress小部件文本区域中它是如何变得不安全的,以及为什么和什么替代方法可以使它安全。

我认为他们试图证明某些东西在一个地方可能是正确的,但在另一个地方却不正确。

他们没有解释,如果数据是安全的,那么为什么“hello world”会出现在表格/方框中。

有人能帮我彻底理解它吗?有人能告诉我怎样才能保证这个例子的安全吗?

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

我是这篇文章的原作者,希望我能详细阐述我的观点(“规则4”)。

这种情况下的“数据”是用户输入的值:

$raw = \'<textarea name="my-textarea"></textarea> Hello World\';
我们在两种上下文中以某种形式显示此数据:

前端视图,其中我们希望呈现用户输入的HTML;小部件管理视图,其中我们希望允许用户查看和编辑他们输入的HTML

class My_Widget extends WP_Widget {
   ...
   public function widget( $args, $instance ) {
    // outputs the content of the widget
    ...
    echo $raw;
    ...
   }
   ...
}
这是“好的”通常,我们可能不希望小部件编辑器能够插入iFrame、脚本标记或不平衡的HTML,但为了便于说明,我们在这里是完全允许的。关键是,当我们在HTML页面中打印要呈现为HTML的变量内容时,我们不需要转义任何内容。

But, 当我们希望以不同的格式显示同一变量时,我们必须以不同的方式对待它(即,我们希望在teaxtarea中打印标记,而不是实际将其呈现为HTML)。

class My_Widget extends WP_Widget {
   ...
   public function form( $instance ) {
    // This is wrong!
    ...
    echo \'<textarea>\' . $raw . \'</textarea>\';
    ...
   }
   ...
}
在上面,我们希望显示标记,而不是渲染它,但我们不采取任何措施来防止$raw 被解释为HTML。这是危险的;HTML is not safe as a value for the textarea. 而对于大多数HTML,如果包含</textarea> 表单将“中断”,并将HTML注入小部件管理页面,如本文所示。

在这种情况下,转义意味着防止$raw 被解释为HTML。WordPress为该实例提供了一个有用的功能:

class My_Widget extends WP_Widget {
   ...
   public function form( $instance ) {
    // This is wrong!
    ...
    echo \'<textarea>\' . esc_textarea( $raw ) . \'</textarea>\';
    ...
   }
   ...
}

相关推荐

Need a help on sanitization

我在评论中有一个主题,我确实在像这样的少数情况下添加了“type”=>“select”部分。$wp_customize->add_setting( \'personal_lite_post_link\', array( \'default\' => \'enable\', \'sanitize_callback\' => \'personal_lite_select_callback\' ) ); $w