web-dev-qa-db-ja.com

Wp_editorからのコンテンツをサニタイズする

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

次のコードでコンテンツを保存したとします。

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

すべてうまくいっていますが、セキュリティはありません(サニタイズ、検証など)

次のコードでコンテンツを保存したとします。

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

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

すべてのスタイルを適用し、メディアを挿入し、サニタイズを含めてコンテンツを保存するにはどうすればよいでしょうか。

wp_kses()について少し読みましたが、良いフィルタをどのように適用できるかわかりません。 (共通のタグを許可します。どのタグをブロックしますか?など)

7
Gio

やってみる

//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
Melch Wanga

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

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

WordPressは入力をサニタイズするためにもっと多くの関数を定義します、 https://codex.wordpress.org/Validating_Sanitizing_and_Escaping_User_Datahttps://codex.wordpress.org/Data_Validation )を見てくださいこのページは本当に役に立ちます。

しかしあなたの文脈ではwp_kses_post関数は正しい選択であるべきです。

2
bueltge

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

/** 
 * 'post' HTMLのほとんどは<textarea>自体を受け入れることを除いて除外されます。
 * @link https://codex.wordpress.org/Function_Reference/wp_kses_allowed_html
 */
 $ allowed_html = wp_kses_allowed_html( 'post'); 
 
 // '<textarea>'タグを削除する
 unset($ 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

私のコードは "Allowing common tags"で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

関数wp_kses_post($ data){
 return wp_kses($ data、 'post'); 
} 
1
Joe

wp_slash 詳細情報。

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