私は、Post Objectに関連付けられたPost Metaのリッチテキスト編集を可能にするためにwp_editor();
のカスタムインスタンスを使用しています。
これらのフィールドの値について、post_content
と同じサニタイズを実行したいと思います。
これが私が思いついたものです:
これが大丈夫なアプローチなのか、それとももっとこれら3つのステップのどちらかでやるべきなのか、それとももっと良いかもっと簡単な方法があるのか教えてください。
save_post
上:
$value = wp_filter_post_kses( sanitize_post_field( 'post_content', $value, 0, 'db' ) );
wp_editor();
に値を渡す:
$value = wp_unslash( sanitize_post_field( 'post_content', $value, 0, 'edit' ) );
フロントエンドでの出力値:
$value = wp_unslash( sanitize_post_field( 'post_content', $value, 0, 'display' ) );
wp_kses
が助けになります。
出入り口でwp_kses_post
を通して結果を渡してください、そして、すべては良いはずです。
覚えておいて、これはthe_content
フィルタによって追加されたものを削除するので、埋め込みとショートコードを保存するために、これを使います:
echo apply_filters( 'the_content', wp_kses_post( $content ) );
esc_textarea
タグを直接使用している場合は、フォームの出力に<textarea>
を使用することもできます。
出力時には、esc_html
があなたの友達です。マークアップを決して含まないテキスト領域がある場合にこれを使用します。入力時にサニタイズするには、入力時にwp_strip_all_tags
を試してください。他のWP APIは、SQLインジェクションが発生しないようにします。
wp_kses
をレスキューに渡し、2つ目のパラメータ、許可されるタグと属性を定義する配列と一緒にwp_kses
に渡します。例えば。:
$allowed = [
'a' => [
'href' => [],
'title' => []
],
'br' => [],
'em' => [],
'strong' => [],
];
echo wp_kses( $content, $allowed );
過度に拡張することにも注意してください。 scriptタグとiframeタグを追加した場合、実際にwp_kses
を使用する意味はありますか?
wp_editor
は内部的に出力します。エスケープすることはできません。そのため、エスケープする必要があります。プリエスケープされたコンテンツを渡しても役に立たないようにしないでください。これにより、出力が誤って出力されたり、二重のエスケープが行われる可能性があります(不正な形式のコンテンツがエスケープを回避するのに最適です)。
出力する関数はエスケープする責任があります。これにより、遅れてのエスケープが可能になります。何度も何度もエスケープすることは確実ではなくなるため、早い回数または複数回エスケープすることは危険であり、新しい複雑な問題が発生します。
あなたは正しい方向に進んでいると思います。
sanitize_post_field()
関数は content_save_pre
フックを呼び出します。これは、DBコンテキストが与えられると、 wp_filter_post_kses
関数 も呼び出すので、それをラップする必要はありません。 。
データベースに保存された時点で私が言うことができる限り、表示のために何もスラッシュ解除する必要はありません。これは私が持っているもので、これはあなたがすでに持っていたものとかなり似ています:
節約値
update_post_meta( $post->ID, '_test', sanitize_post_field( 'post_content', $_POST['_test'], $post->ID, 'db' ) );
合格値
$editor_content = get_post_meta( $post->ID, '_test', true );
wp_editor( $editor_content, 'editor_id_here', array(
'textarea_name' => '_test',
) );
値を表示する
$editor_content = get_post_meta( $post->ID, '_test', true );
$display_content = apply_filters( 'the_content', $display_content );