web-dev-qa-db-ja.com

$ _POSTをサニタイズするためのarray_map()

プラグインのオプションパネルで作業しています。そして、配列が投稿され、オプションテーブルに更新されます。 array_map()関数を使用して、sanitize_text_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
colbyalbo

それはおそらく素晴らしいアイデアではありません。まず、他のフィールドタイプがある場合は、より適切な関数を使用する必要があります。たとえば、textareaフィールドはsanitize_textarea_field()でサニタイズし、カラーピッカーはsanitize_hex_color()でサニタイズする必要があります。

また、_$_POST_には、保存しないフィールドも含まれている可能性が高いことを考慮する必要があります。 API:_option_page_、action __wpnonce_、および__wp_http_referer_。

最後に、関数は基本的にすべての入力を受け入れ、それをデータベースに追加することを意味します。入力をサニタイズしてエスケープすることは、それらがあまり大きなダメージを与えることができないことを意味しますが、それでも防御的にコーディングしていません。理想的には、送信する予定の入力をホワイトリストに登録し、それらのみを送信することをお勧めします。

ただし、設定またはカスタマイズAPIを適切に使用している場合は、_$_POST_を処理する必要はまったくないため、このオプションパネルを正しく構築していないことがわかります。これらのAPIのいずれかを適切に使用する場合、設定の登録時にサニタイズ機能を指定でき、送信の操作は必要ありません。

1
Jacob Peattie

私はあなたが正しい道にいると思います。改善するためにできることは次のとおりです。

関数内のロジックを分離して読みやすくするか、何をしているのかを適切にコメントします。例えば。:

... 

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);      

...






}

1