wp_editorのコンテンツを無害化する


8

によって生成された標準のtextarea / tinymceを見つけることができるカスタム投稿タイプを作成しwp_editor()ましたが、保存部分の問題に直面しています。

次のコードでコンテンツを保存すると、

update_post_meta( $post_id, $prefix.'content', $_POST['content'] );

すべてが正常に機能していますが、セキュリティはありません(サニタイズ、検証など...)

次のコードでコンテンツを保存すると、

update_post_meta( $post_id, $prefix.'content', sanitize_text_field($_POST['content']) );

セキュリティの問題は解決しましたが、コンテンツのスタイルやメディアなどがすべて失われています。

すべてのスタイルを適用し、メディアを挿入し、サニタイズを含めてコンテンツを保存する良い方法は何でしょうか?

少し読みましたが、wp_kses()どうすれば良いフィルターを適用できるのかわかりません。(一般的なタグを許可する場合、どちらをブロックすればよいですか?など)


一般に、「sanitize」という名前の関数をランダムに適用するだけでは、サニタイズされず、セキュリティが向上しない可能性があります。完全なコンテキストなしにセキュリティについて話すことは不可能ですが、一般的には、おそらくいずれかのwp_ksesファミリを使用する必要があります。
Mark Kaplun 2017

値を変換する前にwp_slash($ value)関数を試してください。
ravi patel 2018年

回答:


4

要するに、それはあなたのコンテキスト、エディター内のデータに依存しています。

wp_kses()は本当に役に立ち、カスタム許可されたHTMLを定義できます。または、wp_kses_postまたはのようなデフォルトの関数を使用できますwp_kses_data。この関数は、ユーザーから受け取ったHTMLにホワイトリストの要素のみが含まれていることを確認するのに役立ちます。https://codex.wordpress.org/Data_Validation#HTML.2FXML_Fragmentsを参照してください

WordPressは、入力をサニタイズするためのはるかに多くの関数を定義しています。https://codex.wordpress.org/Validating_Sanitizing_and_Escaping_User_Dataおよびhttps://codex.wordpress.org/Data_Validationを参照してください このページは非常に役立ちます。

しかし、あなたのコンテキストでは、wp_kses_post関数は正しい選択でなければなりません。


3

試す

//save this in the database
$content=sanitize_text_field( htmlentities($_POST['content']) );

//to display, use
html_entity_decode($content);
  1. htmlentities() 同等のHTML文字エンティティを持つすべての文字を同等の文字に変換します。
  2. sanitize_text_field()次に、無効なUTF-8文字をチェックし、それらを取り除きます。これをデータベースに保存できます。
  3. html_entity_decode() HTMLエンティティを対応するHTMLタグに変換します

2
元の投稿者がこれらの機能を使用する理由を説明してください。
Max Yudin 2017

wp_editor()を使用していて、$ _ POST ['youreditor']を独自のデータ構造内の別のオプションで保存したい場合は、これが方法です。wp_kses_post()を追加しました
Nissar

1

あなたはこのような何かをすることができます:

/ **
 *ほとんどの「投稿」HTMLは、<textarea>自体を受け入れません。
 * @リンクhttps://codex.wordpress.org/Function_Reference/wp_kses_allowed_html
 * /
$ allowed_html = wp_kses_allowed_html( 'post');

// '<textarea>'タグを削除します
設定解除($ allowed_html ['textarea']);

/ **
 * wp_kses_allowed_htmlがwp_ksesに誤った値を返す、
 *「true」->「array()」を変更する必要があります
 * /
array_walk_recursive(
    $ allowed_html、
    関数(&$ value){
        if(is_bool($ value)){
            $ value = array();
        }
    }
);
//サニタイズを実行します。
$ value = wp_kses($ value、$ allowed_html);

@fuxia: OPが書いたように:
「wp_kses()について少し読みましたが、どのようにして適切なフィルターを適用できるかわかりません。(一般的なタグを許可して、どれをブロックする必要があるかなど)」

wp_ksesは次のことを行います。
「この関数は、許可されたHTML要素名、属性名、属性値、および適切なHTMLエンティティのみが$ stringで発生することを確認します。この関数を呼び出す前に、PHPのマジッククォートからスラッシュを削除する必要があります。 」
https://codex.wordpress.org/Function_Reference/wp_kses

私のコードはwp_kses「一般的なタグを許可する」で使用します。一般的なタグは何ですか?特定のリンクで読み取ることができるリスト。長いリストなので、ここには貼りませんでした。
https://codex.wordpress.org/Function_Reference/wp_kses_allowed_html

textarea自体はtextareaで許可されるべきではないと思います。

@bueltge
wp_kses_postは、 '<textarea>'タグを許可することを除いて、同じことを行います。
https://core.trac.wordpress.org/browser/tags/4.9.8/src/wp-includes/kses.php#L1575

function wp_kses_post($ data){
    wp_kses($ data、 'post');を返す
}

0

wp_slash詳細情報。

update_post_meta( $post_id, $prefix.'content',wp_slash($_POST['content']) );

これは、SQLクエリに直接入るデータをエスケープするために使用しないでください。Wordpressから。
bilimokur
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.