the_contentが存在しない場合、なぜ脱出するのですか?


8

組み込み関数the_contentはいくつかのフィルターを通過しますが、出力をエスケープしません。HTMLや一部のスクリプトでさえ許可する必要があるため、そうすることは困難です。

出力時に、the_contentはこれらのフィルターを通過するようです(5.0以降)。

add_filter( 'the_content', 'do_blocks', 9 );
add_filter( 'the_content', 'wptexturize' );
add_filter( 'the_content', 'convert_smilies', 20 );
add_filter( 'the_content', 'wpautop' );
add_filter( 'the_content', 'shortcode_unautop' );
add_filter( 'the_content', 'prepend_attachment' );
add_filter( 'the_content', 'wp_make_content_images_responsive' );

(and)

add_filter( 'the_content', 'capital_P_dangit' );
add_filter( 'the_content', 'do_shortcode' );

また、単純な文字列置換も行います。

$content = str_replace( ']]>', ']]>', $content );

そして、get_the_contentは、「more」リンクと外国語のバグに関連する小さな処理を行います。

XSSスクリプトインジェクションを妨げるものはありませんよね?

保存するとき、データ wp_kses_postによって無害化されます。しかし、これはコストのかかるプロセスであるため、出力で使用されない理由を理解しています。

WordPressのエスケープの経験則は、入力の衛生状態に関係なく、できるだけ遅く、すべてをエスケープする必要があるということです。データベースは信頼できるソースとは見なされないため、これを述べた記事をいくつか読んだことがあります。

しかし、上記の理由により、the_contentはそれに従いません。コアテーマ(つまり、TwentyNineteen)も、出力のエスケープを追加しません。

では、なぜ他の場所から脱出するのに役立つのでしょうか?私がデータベースへのアクセス権を持つハッカーである場合、自分のコードを投稿のコンテンツに追加するだけではないですか?


忘れましたwp_kses_post
トムJノーウェル

出力時にwp_kses_postを実行しますか?どこ?
tmdesigned

回答:


10

私がデータベースへのアクセス権を持つハッカーである場合、自分のコードを投稿のコンテンツに追加するだけではないですか?

データベースへのアクセス権がある場合、十分なアクセス権があり、エスケープしても止められない可能性があります。ハッキングされた場合、エスケープはあなたを助けにはなりません。それは想定されていません。脱出する他の理由があります。私が考えることができる2つの主なものは:

消毒されていない入力に対処するには

WordPressの投稿コンテンツは保存時に無害化されますが、それ以外の場合はそうではありません。たとえば、URLのクエリ文字列を介して渡されるコンテンツはサニタイズされません。必ずしも翻訳ファイルのコンテンツではありません。どちらもコンテンツのソースであり、侵害されているサイトとは何の関係もありません。したがって、URLから取得した翻訳可能なテキストとコンテンツはエスケープする必要があります。

ユーザーが誤ってマークアップを壊すのを防ぐには

エスケープはセキュリティのためだけではありません。また、ユーザーが誤ってサイトのマークアップを壊すのを防ぐためにも必要です。たとえば、ユーザーが>プラグインのコンテンツに引用符や記号を配置するとマークアップが壊れる場合は、その出力をエスケープする必要があります。ユーザーがこれらの文字を使用したい場合がある完全に正当な理由があるので、入力のサニタイズに過度に積極的になりたくはありません。


「脱出は悪者からの保護だけではありません。ソフトウェアの耐久性を高めるだけです。ランダムな悪い入力に対して、悪意のある入力に対して、または悪天候に対して。」

これは、エスケープに関するWordPress VIPガイドラインからの抜粋です。この件に関してはまだまだ多くのことを述べていますので、ぜひ読んでください。


ありがとう、それは役に立ちます。私はエスケープについてVIPに関する投稿を読みましたが、著者は、誰かがDBではなくサーバーにアクセスしたという考えを具体的に述べました。しかし、その点についてのあなたの推論はもっと理にかなっていると思います。また、誰かがデータベースに完全にアクセスしていなくても、つまり、プラグインまたはコメントだけで、脆弱なコンテンツをデータベースからエスケープしている場合があると思います。
tmdesigned

9

私は実際にはVIPのエンジニアであり、多くのコードレビューを行っています。

しかし、出力をエスケープしません

不正解です。出力時にエスケープされません。これはほとんどの人にとって驚くべきことです。これは、あなたが特権管理者である場合はそのunfiltered_html機能を持っているため、出力時にエスケープできないためです。代わりにwp_kses_post、入力時に実行されます。ただし、理想的にはその機能を削除します。

現在の実装は次のとおりです。

function the_content( $more_link_text = null, $strip_teaser = false ) {
    $content = get_the_content( $more_link_text, $strip_teaser );

    /**
     * Filters the post content.
     *
     * @since 0.71
     *
     * @param string $content Content of the current post.
     */
    $content = apply_filters( 'the_content', $content );
    $content = str_replace( ']]>', ']]>', $content );
    echo $content;
}

the_content一方、フィルターを通過するものをエスケープするための理想的なメカニズムは次のとおりです。

echo apply_filters( 'the_content', wp_kses_post( $content ) );

このようにして、コンテンツを安全にしてから、フィルターを介して実行し、埋め込みなどが取り除かれることを回避します。

なぜ脱出するのか

エスケープのポイントは、有効なHTMLを生成することです。HTMLが提供する追加のセキュリティは、素晴らしい副作用です。

ユーザーが誤ってマークアップを壊すのを防ぐには

逃げるには多くの理由がありますが、基本的に、あなたは期待を強制しています。次のコードを見てください。

<a href="<?=$url?>">

属性に$url適したURLが含まれることを期待していますhrefが、そうでない場合はどうなりますか?なぜそれを偶然に任せて、それを強制しましょう:

<a href="<?=esc_url( $url )?>">

現在は常にURLになります。ハッカーが画像を$urlに配置したかどうか、ユーザーが間違ったフィールドに入力したかどうか、または悪意のあるスクリプトがあるかどうかは関係ありません。これはURLになるので、常に有効なURLになります。確かに非常に奇妙なURLかもしれませんが、URLがそこにあるという期待は常に満たされます。これは、マークアップ検証やセキュリティなど、非常に便利です。

とはいえ、脱出は検証ではなく、脱出はサニタイズではありません。これらは、ライフサイクルのさまざまな時点で発生する個別のステップです。エスケープすると、期待に応えるように強制されます。

時々、脱出を巨大な泡の壁で切り取られた日本のゲームショーの1つとして考えるのが好きです。競技者は犬の形に合わせる必要があります。そうしないと廃棄されます。私たちの目的のためだけに、穴の周りにレーザーとナイフがあります。最後に残されたものはすべて犬の形になり、あなたがまだ犬の形をしていない場合は許されず厳格になります。

覚えておいてください:

  • 早く消毒する
  • 早期に検証
  • 遅く逃げる
  • しばしば逃げる

セキュリティは複数のステップであり、多層防御のタマネギであり、エスケープは出力に対する防御の外側の層の1つです。侵害されたサイトで攻撃コードを壊し、役に立たないようにし、オープンなエクスプロイトを阻止し、クライアントがサイトを破壊してはいけないフィールドにタグを配置しないようにします。それは他のものに代わるものではありません、そしてそれは断然、開発者向けハンドブックで最も使用されていないセキュリティツールです。

なぜ逃げthe_contentられないのか?洪水が発生し、壁に5つの穴があり、3つを修正する時間しかない場合、肩をすくめて何も修正しませんか?または、リスクを軽減して攻撃範囲を縮小しますか?

多分私はこのスニペットでそれらの最後の2つの穴を修正するのを助けることができます:

add_filter( 'the_content' function( $content ) {
    return wp_kses_post( $content );
}, PHP_INT_MAX + 1 );

ここでは、PHPで優先度を最も高い数値に設定し、1を追加して、表現できる最も低い数値にオーバーフローします。このように、へのすべての呼び出しはthe_content、他のフィルターの前に値をエスケープします。この方法でも埋め込みなどは機能しますが、ユーザーはデータベースを介して危険なHTMLに忍び込むことはできません。さらに、unfiltered_htmlすべてのロールから機能を削除することを検討してください


1
追加の視点をありがとう。私は実際にあなたのサイトでこの件に関するあなたの投稿を読んでいて、何か追加することがあるかどうか疑問に思っていました。
tmdesignは

4

エスケープのポイントは、有効なHTMLを生成することです。HTMLが提供する追加のセキュリティは、素晴らしい副作用です。

コンテンツに適用されるフィルターは、HTMLとショートコードのような他の構文を持つ他のテキストの混合であるものから有効なHTMLを生成します。一部のコンテンツは既に有効なHTMLであるため、すべてのコンテンツにエスケープを適用できません。

用としてkses使用するかを知るために十分なコンテキストを持っていないので、関連する機能は、主にそれらを適用することはできません。たとえばthe_content、JSが正当であるかどうかにかかわらず、フィルターを使用して投稿コンテンツにJSを追加するプロセスのために、コアが投稿者のようなものに基づいてコアが推測できない場合があります。

では、なぜ他の場所から脱出するのに役立つのでしょうか?私がデータベースへのアクセス権を持つハッカーである場合、自分のコードを投稿のコンテンツに追加するだけではないですか?

この場合も、エスケープは有効なHTMLを生成するためのものです。セキュリティPOVから、エスケープがセキュリティを提供するのではなく、エスケープがうまくいくコードが疑わしいはずです。たとえば、コアが_e翻訳を使用する方法と '__` は、非公式の翻訳をインストールするように説得できるすべての人が、翻訳ファイルでJSを検出するのを困難にしてサイトをハッキングできる可能性があることを意味します。これは、「私が言うことではなく、私が言うことをする」の良い例です。


追加の視点を提供してくれたMarkに感謝します。
tmdesigned

2

私がデータベースへのアクセス権を持つハッカーである場合、自分のコードを投稿のコンテンツに追加するだけではないですか?

あなたの質問はそれ自体で答えると思います。あなたがデータベースへのアクセス権を持つハッカーであれば、あなたはすでに必要なアクセス権を獲得しています。出力をエスケープしても、それはまったく変わりません。

出力をエスケープする理由は、ハッカーがそもそもアクセスを取得しないように、信頼できないデータを評価することです。


ご回答有難うございます。森を見逃してしまったハッカーを防ぐために、あまりにも集中しすぎたと思います。
tmdesigned
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.