esc_htmlフィルターとattribute_escapeフィルターの違いは何ですか?


8

esc_htmlattribute_escapeフィルターの正確な違いは何ですか?

esc_html()使用esc_html filteresc_attr()使用attribute_escape filter。どちらも<>& "'(より小さい、より大きい、アンパサンド、二重引用符、単一引用符)をエンコードします。

彼らがセキュリティの点でどのように正確に異なるのか(脱出)に興味があります


まあ、それらが違っていなければ、2つを用意する必要はありません... IMOの質問は明確ではないので、the_contentフィルターとthe_excerptフィルターの違いは何かを尋ねるようなものです
Mark

1
私はそれが彼が求めていることだと思います、それらはどのように違うのですか?なぜですか?
トムJノーウェル

@TomJNowell、よく1つは属性をエスケープするために呼び出され、もう1つは一般的なHTMLをエスケープするために呼び出されます。それが理由を説明し、主にその方法も説明します;)属性と一般的なhtmlで許可されている文字の違いを説明しながら、ここから答えをどこから始めるべきですか?これは少し基本的すぎるように聞こえます(しかし、OPが私が推測しているように思うかもしれません)
Mark Kaplun 2017

2
それは良いことですが、役に立たないesc_attrエスケープの例はesc_html、結局esc_htmlどこでも使用しないのですか?それはあなたに明らかだ場合、それは良い質問のように見えるではないかもしれないが、与えられた、それはこれらの2つの機能がどのように異なるかアスカーに明らかにされていません彼らは文字をエスケープし、両方の期待
トム・J Nowell

回答:


8

箱から出して、違いはないように見えます

function esc_html( $text ) {
    $safe_text = wp_check_invalid_utf8( $text );
    $safe_text = _wp_specialchars( $safe_text, ENT_QUOTES );
    /**
     * Filters a string cleaned and escaped for output in HTML.
     *
     * Text passed to esc_html() is stripped of invalid or special characters
     * before output.
     *
     * @since 2.8.0
     *
     * @param string $safe_text The text after it has been escaped.
     * @param string $text      The text prior to being escaped.
     */
    return apply_filters( 'esc_html', $safe_text, $text );
}
function esc_attr( $text ) {
    $safe_text = wp_check_invalid_utf8( $text );
    $safe_text = _wp_specialchars( $safe_text, ENT_QUOTES );
    /**
     * Filters a string cleaned and escaped for output in an HTML attribute.
     *
     * Text passed to esc_attr() is stripped of invalid or special characters
     * before output.
     *
     * @since 2.0.6
     *
     * @param string $safe_text The text after it has been escaped.
     * @param string $text      The text prior to being escaped.
     */
    return apply_filters( 'attribute_escape', $safe_text, $text );
}

2つの関数の唯一の違いは、最後に適用されるフィルターです。WordPressはこれらのフィルターに何も追加しないため、標準のWPインストールでは、これらは非操作です。それらは、誰かがそれらを必要とする可能性がある場合に備えて提供されます。

クイックQ&A

では、デフォルトでそれらは同じですか?

はい!機能は同じ実装を持っていますesc_attresc_html

フィルターは同じですか?

唯一の違いは、名前が異なり、同じように機能し、同じように使用され、コアでどちらのフィルターも使用されないことです。

フィルターは何かしますか?

番号!すべてのエスケープは、関数wp_check_invalid_utf8と関数_wp_specialcharsが呼び出されたときに行われます。

フィルターはエスケープを行わず、プラグインが追加のチェックと処理を行う機会です。

エッジケースはありますか?

フィルターを使用する場合にのみ、フックしたesc_htmlがフックしていないattribute_escape、またはその逆であると言います。標準のWPインストールの場合、2つの機能は同じですが、違いはありません。

なぜattribute_escapeありませんかesc_attr

下位互換性。以前attribute_escapeesc_関数がありましたが、スタイル関数が追加された後に非推奨としてマークされています。

なぜこれらのフィルターを使用するのですか?

¯\_(ツ)_/¯これはまれな状況です。一部の人々は、翻訳APIが置換テキストを検索するために乱用されるのと同じ方法でそれを乱用するかもしれません。これらのフィルターは頻繁に呼び出されるため、これはすでに悪い習慣です。小さな速度損失が何千回も拡大されます

ただし、注意しないと、追加されたエスケープを元に戻したり、エスケープされていないコンテンツを最後に追加したりして、これらの機能のセキュリティを危険にさらす可能性があることを考慮してください。そのため、フィルターは危険です。

これについて心配する必要がありますか?

いいえ。心配する必要があるのは、これらのフィルターを使用した場合のみです。フィルター自体が、開発中の何かが深刻な問題を起こしたことを示す大きな赤い警告を発しているはずです。

関数esc_attresc_html安全に使用でき、コンテンツをエスケープします。コードのセキュリティを重視する場合、それらを使用する倫理的および道徳的な義務があります

これは私が使用するだけでよいという意味esc_htmlですか?

いいえ、エスケープはすべての期待を設定することです。属性が必要な場合は、を使用してくださいesc_attr。現時点で機能的に同じだからといって、将来的にセキュリティリリースで変更されなくなるわけではありません


答えてくれてありがとう。多分私は私の質問を言い換える必要があります。上記の2つのフィルターのコア実装に違いがあるかどうかを知りたいです。これは、私たち(開発者)が属性とHTMLでエスケープがどのように機能するかを知るのに本当に役立ちます。
djadmin 2017

これらのフィルターはCoreでは使用されず、必要に応じてプラグイン用に提供されます。ただし、セキュリティ上の理由から、使用しないことを強くお勧めします
Tom J Nowell

「esc_htmlとattribute_escapeフィルターはこのように非常に危険です。」私は本当にこの点を理解していません。これを使用しない場合、ユーザー入力をエスケープしてXSSを防ぐにはどうすればよいですか?
djadmin

あなたが言ったように、彼らは終了する前にフィルターを通過します。私の元の質問は、これらの2つのフィルターが実装の点でどのように異なるかです。私は、esc_htmlフィルターエスケープとattribute_escapeフィルタードンが一致しない、またはその逆のエッジケースがあると考えています。
djadmin

彼らはしません。フィルターはサードパーティのコード用に提供されており、Coreでは使用されません。コアはフィルターにフックしませんし、フィルターに対して何もしません。これらのエッジケースは、テーマまたはプラグインの開発者が作成する必要があります。その時点で、それを書いたのがあなたであることは明らかです
Tom J Nowell
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.