私は自分の投稿メタを更新する前にwp_kses
を使ってサニタイズしたいカスタム投稿テキストボックスを持っています。
私は一般的な$allowed
設定の例を探していましたが、私はこの例だけを見ました:
$allowed = array(
'a' => array( // on allow a tags
'href' => array() // and those anchors can only have href attribute
)
);
一般的なwp_kses
$allowed
設定は何ですか?誰かが彼らが通常フィルターにかけるものの例を提供することができますか?
私は@ JaredCobbによって投稿された解決策に同意しないでしょう、wp_kses()
は彼が提示した方法よりはるかに柔軟です。タグ自体を破壊することなく、タグから不要な属性を取り除くことができます。たとえば、ユーザが<strong class='foo'>
を入力した場合、クラスを許可しないとwp_kses()
は<strong>
を返しますが、strip_tags()
は<strong>
を完全に削除します。
@redconservatory:使用したい属性は次のとおりです。
$args = array(
//formatting
'strong' => array(),
'em' => array(),
'b' => array(),
'i' => array(),
//links
'a' => array(
'href' => array()
)
);
これはhref
属性を持つアンカータグだけでなく、属性を持たない太字や斜体を許可します。これは、ホワイトリストの原則を使用しています。@jaredcobbは、ここで正しい方法を説明しています。
私はWordPressがコメントに使うのと同じ$allowedtags
配列から始めます。それらの配列は[wordpress directory]/wp-includes/kses.php
ファイルにあります。これらは私にとって賢明なデフォルトのように見え、良い出発点です。これが彼らの配列です...
$allowedtags = array(
'a' => array(
'href' => true,
'title' => true,
),
'abbr' => array(
'title' => true,
),
'acronym' => array(
'title' => true,
),
'b' => array(),
'blockquote' => array(
'cite' => true,
),
'cite' => array(),
'code' => array(),
'del' => array(
'datetime' => true,
),
'em' => array(),
'i' => array(),
'q' => array(
'cite' => true,
),
'strike' => array(),
'strong' => array(),
);
私はNOTstrip_tags
の代わりにPHPのwp_kses
を使うでしょう。
WordPressのwp_kses()がPHPのstrip_tags()よりセキュリティが優れている理由を説明する簡単なビデオを作成しました .
そこに行きます。これはWordPressとWordPressの外部の両方で機能します。
<?php
$str = ' I am <strong>stronger</strong> and cooler every single day <aaaaa>. ';
echo orbisius_html_util::strip_tags($str);
/**
* Util HTML class
* @author Svetoslav Marinov (SLAVI) | http://orbisius.com
*/
class orbisius_html_util {
/**
* Uses WP's wp_kses to clear some of the html tags but allow some attribs
* usage: orbisius_html_util::strip_tags($str);
* uses WordPress' wp_kses()
* @param str $buffer string buffer
* @return str cleaned up text
*/
public static function strip_tags($buffer) {
static $default_attribs = array(
'id' => array(),
'class' => array(),
'title' => array(),
'style' => array(),
'data' => array(),
'data-mce-id' => array(),
'data-mce-style' => array(),
'data-mce-bogus' => array(),
);
$allowed_tags = array(
'div' => $default_attribs,
'span' => $default_attribs,
'p' => $default_attribs,
'a' => array_merge( $default_attribs, array(
'href' => array(),
'target' => array('_blank', '_top'),
) ),
'u' => $default_attribs,
'i' => $default_attribs,
'q' => $default_attribs,
'b' => $default_attribs,
'ul' => $default_attribs,
'ol' => $default_attribs,
'li' => $default_attribs,
'br' => $default_attribs,
'hr' => $default_attribs,
'strong' => $default_attribs,
'blockquote' => $default_attribs,
'del' => $default_attribs,
'strike' => $default_attribs,
'em' => $default_attribs,
'code' => $default_attribs,
);
if (function_exists('wp_kses')) { // WP is here
$buffer = wp_kses($buffer, $allowed_tags);
} else {
$tags = array();
foreach (array_keys($allowed_tags) as $tag) {
$tags[] = "<$tag>";
}
$buffer = strip_tags($buffer, join('', $tags));
}
$buffer = trim($buffer);
return $buffer;
}
}
HTMLタグの/ filter attributes を許可することが特に必要な場合にのみwp_kses
を使用しました(たとえば、<image>
属性を持つがsrc=""
タグを許可されるようにしたいのですが、I しない href=""
やstyle=""
、あるいはimageタグの何か他のものにできるようにしたくない場合は、wp_kses
を使うと便利です(作成した例でわかるように)。ただし、wp_kses
を使用することはめったにありませんが、数ヵ月後にコードを見たときに、2つのネイティブPHP関数(下記)がうまくいくことがわかりやすいためです。
あなたがHTMLタグを完全に削除したいのであれば(おそらくいくつかを除いて)、私はいつも strip_tags
を使います。許可されたタグの文字列(<p> <br> <strong>
など)を渡すことも、他の無害なタグを好きなように渡すこともできます。これにより、ユースケースに該当する場合、ユーザーは書式設定をsomeで制御できるようになります。データをサニタイズするにはホワイトリストアプローチが必要なので、strip_tags
が好きです。 (つまり、 everything は、明示的にホワイトリストに登録されているものを除いて削除されます)。
あなたの目標がHTMLをコンテンツに入れることを許可することであるが、あなたが彼らがそれを入力したように彼らのテキストを見せたいだけであるならば、 htmlspecialchars
を使ってください。これはHTML文字をそれらのエンコードされた対応物に変換するので、あなたはそれを安全にページに出力することができます。
str_replace
を使ってコードに出くわすかもしれません。データをサニタイズするにはblacklistアプローチが必要で、常にブラックリストが最新のものであることを確認する必要があるため、このアプローチはお勧めできません。
要するに、それはあなたのメタボックスが何のために使われているかにかかっています。悪意のあるユーザーかもしれないユーザーからの入力から保護するのであれば、strip_tags
をお勧めし、無害なタグをいくつか許可するだけです。ユーザーのコンテンツのタグと特定の属性を実際にマイクロ管理するための適切なビジネスケースがある場合は、use wp_kses
です。
投稿コンテンツで使用され、パラメータとしてデータのみを必要とするwp_kses_post関数を使用することもできます。
ここでより多くの情報: http://codex.wordpress.org/Function_Reference/wp_kses_post
@Svetoslavマリノフ
このコードを$ buffer = trim($ buffer)の直後に追加しました。
$string_limpa = array(
'<div><p><\/div>' => '<br>',
'<div><br><\/div>'=> '<br>',
'<div align="left"><br><\/div>' => '<br>',
'<div align="center"><br><\/div>' => '<br>',
'<div align="right"><br><\/div>' => '<br>',
'<div style="text-align: left;"><br><\/div>' => '<br>',
'<div style="text-align: center;"><br><\/div>' => '<br>',
'<div style="text-align: right;"><br><\/div>' => '<br>',
'<div style="text-align: justify;"><br><\/div>' => '<br>',
'class="Apple-style-span"' => '<br>',
'<p><br></p>' => '<br>',
'<p><b></p>' => '<br>',
'<p><i></p>' => '<br>',
'<p><u></p>' => '<br>',
'\r' => '<br>',
'\n' => '<br>',
'\t' => ' ',
'\0' => ' ',
'\x0B' => '<br>',
'<p style="text-align: center;"><br></p>' => '<br>'
);
return strtr($buffer, $string_limpa);
hTMLをきれいにして、コードを壊して隠された文字を貼り付けないようにするために、それはうまくいきません、それはHTMLをきれいにします、しかし隠された文字はまだ残っています。