ARRAY_MAP()用于清理$_POST

时间:2019-06-15 作者:colbyalbo

我正在为一个插件制作一个选项面板。并将一个数组发布并更新到选项表中。我正在使用array\\u map()函数使用sanitize\\u text\\u fields()遍历数组

这是做这件事的最佳方式吗?

 if( ! empty( $_POST[\'my_array\'] ) ) {
            foreach( $_POST[\'my_array\'] as $value ) {
                $value = array_map( \'sanitize_text_field\', $value );
                update_option( \'my_option_value\', $value );
            }
        } 

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

这可能不是个好主意。首先,如果您有其他字段类型,那么您可能应该使用更合适的函数。例如textarea 应使用sanitize_textarea_field(), 和颜色选择器应使用sanitize_hex_color().

你也应该考虑一下$_POST 可能还包含您不想保存的字段,例如为设置API供电的隐藏输入:option_page, action _wpnonce, 和_wp_http_referer.

最后,这意味着您的函数本质上接受所有输入,并将其添加到数据库中。虽然清除和逃逸输入意味着它们不会造成太大的伤害,但您仍然没有进行防御性编码。理想情况下,您应该将希望提交的输入列为白名单,并且只提交这些输入。

但是,您不需要处理$_POST 如果正确使用设置或自定义API,这表明您没有正确构建此选项面板。如果正确使用这两个API中的任何一个,则可以在注册设置时指定清理功能,并且不需要对提交进行任何操作。

SO网友:Lucas Vendramini

我认为你走的是正确的道路。您可以改进的是:

分离函数中的逻辑以增加可读性或对您正在做的事情进行良好的注释。E、 g.:

... 

function mytheme_sanitize_fields($fields){

   foreach($fields as $field){
      mytheme_sanitize_field($field);
   }

}


function mytheme_sanitize_field($field){
      if( is_array($field){
           $value = array_map( \'sanitize_text_field\', $field );

      }
      else{

           $value = sanitize_text_field($field);
      }

      update_option(\'yourkey\', $value);

...

}


...


mytheme_sanitize_fields($_POST);      

...






}

相关推荐

static array on functions.php

在函数中。php中,我想访问数据库一次,以获取一个ACF对象,然后在本地“保存”它,以防止对数据库的进一步请求。我想首先在“init”钩子中调用以下函数。然后,假设,当我在以后的挂钩上调用它时,由于使用了“static”关键字,$current\\u store var已经设置好了,函数将在第一个“if”返回已经保存的静态var时停止。它不起作用-当访问稍后挂钩上的函数时,“isset($current\\u store)”返回false。我做错了什么?function get_current_store