web-dev-qa-db-ja.com

`wp_editor();`データベース、編集、表示の値をサニタイズする

私は、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' ) );
3
Michael Ecklund

wp_ksesが助けになります。

私の編集者Post Mightすべてを含む

出入り口でwp_kses_postを通して結果を渡してください、そして、すべては良いはずです。

覚えておいて、これはthe_contentフィルタによって追加されたものを削除するので、埋め込みとショートコードを保存するために、これを使います:

echo apply_filters( 'the_content', wp_kses_post( $content ) );

esc_textareaタグを直接使用している場合は、フォームの出力に<textarea>を使用することもできます。

私の編集者はテキストを含みますが、マークアップはありません

出力時には、esc_htmlがあなたの友達です。マークアップを決して含まないテキスト領域がある場合にこれを使用します。入力時にサニタイズするには、入力時にwp_strip_all_tagsを試してください。他のWP AP​​Iは、SQLインジェクションが発生しないようにします。

私のエディタにはマークアップが含まれていますが、サブセットは限られています

wp_ksesをレスキューに渡し、2つ目のパラメータ、許可されるタグと属性を定義する配列と一緒にwp_ksesに渡します。例えば。:

$allowed = [
    'a' => [
        'href' => [],
        'title' => []
    ],
    'br' => [],
    'em' => [],
    'strong' => [],
];

echo wp_kses( $content, $allowed );

過度に拡張することにも注意してください。 scriptタグとiframeタグを追加した場合、実際にwp_ksesを使用する意味はありますか?

wp_editor

wp_editorは内部的に出力します。エスケープすることはできません。そのため、エスケープする必要があります。プリエスケープされたコンテンツを渡しても役に立たないようにしないでください。これにより、出力が誤って出力されたり、二重のエスケープが行われる可能性があります(不正な形式のコンテンツがエスケープを回避するのに最適です)。

出力する関数はエスケープする責任があります。これにより、遅れてのエスケープが可能になります。何度も何度もエスケープすることは確実ではなくなるため、早い回数または複数回エスケープすることは危険であり、新しい複雑な問題が発生します。

1
Tom J Nowell

あなたは正しい方向に進んでいると思います。

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