WP中定制贴子类型Metabox的卫生选择选项

时间:2014-02-01 作者:user1760110

使用WordPress 3.8.1,我有一个名为“Map”的自定义帖子类型,它包含一个元数据,该元数据是一个Select options元素,如下所示:

<label for="my_meta_box_select">Countries</label>
<select name="my_meta_box_select" id="my_meta_box_select">
<option value="asia" <?php selected( $selected, \'asia\' ); ?>>Asia</option>
<option value="africa" <?php selected( $selected, \'africa\' ); ?>>Africa</option>
<option value="america" <?php selected( $selected, \'america\' ); ?>>America</option>
</select>

$selected = isset( $values[\'my_meta_box_select\'] ) ? esc_attr( $values[\'my_meta_box_select\'][0] ) : \'\';
到目前为止,我使用以下代码保存所选选项:

if( isset( $_POST[\'my_meta_box_select\'] ) )
    update_post_meta( $post_id, \'my_meta_box_select\', esc_attr( $_POST[\'my_meta_box_select\'] ) );
但从安全检查的角度来看,我不确定这是否足够安全?!我是否还需要检查任何类似于对此类输入进行消毒或逃逸的内容?(我已经了解到,我们可以清理文本输入,但不能确定选择或复选框输入。)

2 个回复
最合适的回答,由SO网友:cybmeta 整理而成

您应该在显示数据时而不是在保存数据时对其进行scape。为了净化,我认为在这种情况下最好的选择是sanitize_text_field()

if( isset( $_POST[\'my_meta_box_select\'] ) ) {
    update_post_meta( $post_id, \'my_meta_box_select\', sanitize_text_field( $_POST[\'my_meta_box_select\']   ) );
}
然后,仅当要将数据用作应该使用的属性时esc_attr():

$selected = isset( $values[\'my_meta_box_select\'] ) ? esc_attr( $values[\'my_meta_box_select\'][0] ) : \'\';
<select name="my_meta_box_select" id="my_meta_box_select">
   <option value="asia" <?php $selected == \'asia\') ? \'selected\'; ?>>Asia</option>
   <option value="africa" <?php $selected == \'africa\') ? \'selected\'; ?>>Africa</option>
   <option value="america" <?php $selected == \'america\') ? \'selected\'; ?>>America</option>
</select>
如果还想验证数据,则应按照Rarst在回答中的建议,与有效值列表进行比较(或其他验证比较)(在这种情况下,您可以跳过清理,因为如果该值具有无效值,则不会触发update_post_meta() 功能):

    if( isset( $_POST[\'my_meta_box_select\'] ) ) {
        $value = $_POST[\'my_meta_box_select\'];
        if ( in_array( $value, array(\'asia\', \'africa\', \'america\'), true ) ) {
            update_post_meta( $post_id, \'my_meta_box_select\', $value );
        }
    }

SO网友:Rarst

您试图确保数据是安全的,但没有验证它,即确保它是安全的和有意义的。

在您的情况下,您的数据可以是一组固定的值,检查数据是否属于该组是有意义的。例如:

if ( in_array( $value, array(\'asia\', \'africa\', \'america\'), true ) ) {
    // all good
}

结束

相关推荐

MetaBox Layout for all users

我想知道:你是管理员:当你在页面或帖子中重新排序元框的布局时,此布局将与你的用户profile一起保存:例如,你将类别框拖到发布框之前。。。是否可以为其他用户(编辑、作者等)保存此布局?是否可以为每种类型的用户组织布局,而不必使用他们的帐户登录?谢谢你的帮助!