web-dev-qa-db-ja.com

一般的なwp_kses $

私は自分の投稿メタを更新する前にwp_ksesを使ってサニタイズしたいカスタム投稿テキストボックスを持っています。

私は一般的な$allowed設定の例を探していましたが、私はこの例だけを見ました:

$allowed = array(  
        'a' => array( // on allow a tags  
            'href' => array() // and those anchors can only have href attribute  
        )  
    );  

一般的なwp_kses$allowed設定は何ですか?誰かが彼らが通常フィルターにかけるものの例を提供することができますか?

8
redconservatory

私は@ 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は、ここで正しい方法を説明しています。

6
mor7ifer

私は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を使うでしょう。

未知のユーザのコンテンツをフィルタするためにstrip_tagsを使うべきではありません!

WordPressのwp_kses()がPHPのstrip_tags()よりセキュリティが優れている理由を説明する簡単なビデオを作成しました .

6
mikemick

そこに行きます。これは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;
    }
}
2

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です。

2
Jared Cobb

投稿コンテンツで使用され、パラメータとしてデータのみを必要とするwp_kses_post関数を使用することもできます。

ここでより多くの情報: http://codex.wordpress.org/Function_Reference/wp_kses_post

1
OriginalEXE

@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をきれいにします、しかし隠された文字はまだ残っています。

0
Pluda