典型的なwp_kses $ allowed


9

wp_kses投稿メタを更新する前に、消毒したいカスタム投稿テキストボックスがあります。

一般的な$allowed設定の例を探していましたが、この例しか見たことがありません。

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

典型的なwp_kses $allowed設定は何ですか?誰かが彼らが通常フィルタリングする対象の例を提供できますか?


複数の正解があるため、この質問はサイトの範囲外です。質問の範囲を狭める場合は、使用例を提示し、含める必要があるものを提供するように誰かに依頼してください。
mor7ifer

ユーザーが通常のテキスト、太字、リンク、斜体だけを入力できるリッチテキストボックスが必要です
redconservatory

回答:


8

@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が正しく指摘しているホワイトリストの原則を使用しています。


どのタグが許可されているかをストリップタグに伝えることはできませんか?php.net/manual/en/function.strip-tags.php
redconservatory

けれども、私はまだ... wp_ksesは今、私はそれが不要なクラスを取り除きどのように見ることができるという優れているかを確認することができます
redconservatory

私はおそらく明確に説明しなかったでしょう...しかし、はい、wp_ksesネイティブのPHPオプションよりも多くの制御が可能です。私はそう言ったと思います。「属性」という言葉も使用しました。それはあなたのユースケースに依存すると言っていました。すべてのタグからデータを保護しようとする人は、strip_tags IMHOを使用したほうがよいでしょうが、何よりも私の好みです。乾杯。
Jared Cobb

7

$allowedtagsWordPressがコメントに使用するのと同じ配列から始めます。[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(),
);

の代わりにPHPを使用しませんstrip_tagswp_kses

未知のユーザーのコンテンツをフィルタリングするためにstrip_tagsを使用しないでください!

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


こんにちは&nbpsについては何ですか
Latheesh VM Villa

2

HTMLタグの属性wp_ksesを許可/フィルターする必要がある場合にのみ使用しました(たとえば、属性を持つタグを許可することを許可したいが、許可したくないが、またはイメージタグの他の何か。その場合、(作成した例を見るとわかるように)非常に具体的にフィルタリングできるため便利です。ただし、ネイティブPHPが関数(下記)がトリックを実行し、数か月後にコードを見ると理解しやすくなっています。<image>src=""href=""style=""wp_kseswp_kses

HTMLタグを完全に削除したい場合(いくつかを許可する場合を除く)、常にを使用しますstrip_tags。許可されたタグの文字列(など<p> <br> <strong>)または他の無害なタグを渡すことができます。これにより、ユースケースに該当する場合は、ユーザーがフォーマットをある程度制御できるようになります。データを無害化するstrip_tagsためにホワイトリストのアプローチを取るので、私は好きです。(明示的にホワイトリストに登録したものを除いて、すべてが取り除かれることを意味します)。

HTMLをコンテンツに挿入できるようにすることを目標としていますが、ユーザーが入力したテキスト(コード例など)のみを表示したい場合は、を使用しますhtmlspecialchars。これにより、HTML文字がエンコードされた文字に変換され、ページに安全に出力できます。

str_replaceまたはのような悪いタグを「探す」コードを使用しているコードに遭遇するかもしれません。データのサニタイズにはブラックリストアプローチを採用しており、ブラックリストが最新であることを常に確認する必要があるため、このアプローチはお勧めしません。

要約すると、それはあなたのメタボックスが何に使用されているかによって異なります。ユーザーからの入力(悪意のある可能性がある)から保護strip_tagsする場合は、無害なタグの一部を許可することをお勧めします。あなたが本当にmicromanageにタグやユーザのコンテンツの特定の属性を優れたビジネスケースを持っている場合は、use wp_kses


ていないwp_kses()すべてやるstrip_tags()行い、より多くの?私はすべて物事をシンプルに保つことを目的としていますが、誰も「驚くこと」ではないという主張もあると思います。wp_kses()これは「Wordpressの方法」であり、Wordpressコードを作成しているため、おそらくそれがより良い選択であるという議論があります。さらに、将来のある時点で、特定のタグ/属性の組み合わせをホワイトリストに登録したい場合wp_kses()は、最初から使用するのにリファクタリングは必要ありません。
rinogo 2018

2

どうぞ。これは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;
    }
}

こんにちは、スヴェトスラフさん、今日もこれは安全ですか?私はバックオフィスへのユーザー入力を無害化するためのシンプルで安全な方法を探していました(Wordpressではありません)コードにあるような基本的なhtml形式の使用を許可したい<b>、<I>、< u>。これをstrip_tags($ _ POST ['myDoc'])として使用できると思いますか、それとも安全のために他に何をすべきかと思いますか?手伝ってくれてありがとう!
Pluda 2018年

こんにちは、私のコードを使用してください。WordPressコンテキスト内で実行されるかどうかをチェックし、WP関数を使用するかどうかをチェックします。それ以外の場合は、php strip_tagsにフォールバックします。また、ある時点でデータをGETパラメータとして渡す可能性があるため、$ _ POSTではなく$ _REQUESTを使用することをお勧めします。
スベトスラフマリノフ2018年

返信ありがとう:-)。私は今問題に苦労しています...フォーマットされたhtmlを貼り付けたり、例として崇高なテキストからのコードを3貼り付けた場合、ほとんどのテキストが欠落しているため、スクリプトを壊すいくつかの非表示のフォーマットされたコードがあるはずです。
Pluda

utf8エンコードの問題である可能性があります
Svetoslav Marinov '11

上記の回答で投稿したようにhtmlをクリーンアップして、\ n、\ rなどを検索している可能性がありますが、問題はまだあります:-(。数年前、私はコピーした文字列をきれいにするテキストエディットにコピーペーストを使用し、しかし、私は私のユーザーが同じことをするだろう期待することはできません。
Pluda


0

@Svetoslav Marinov

$ 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はクリーンアップされますが、非表示文字は残ります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.