web-dev-qa-db-ja.com

エコーのesc_attr/esc_html/esc_url

こんにちは私はいつ、なぜこれらのesc-alternativesを使うべきか理解しようとしています、そして今のところ私は入力が間違った文字を含んでいないことを保証する必要があると思います。

私がまだ疑問に思っているのは、HTMLフィールドでesc_attrを常に使用するべきか、それとも連絡フォームの入力フィールドを例にするべきかということです。そして、私はいつも私自身のすべてのURLにesc_urlを使うべきです、例えばimage src paths?

そしてthe_title()はどうですか?コード内のすべてのエコーに対して、またはユーザーからの入力がある可能性がある場合にのみ、これらのエスケープのいずれかを使用する必要がありますか?

5
emcolsson

はい!あなたはいつも逃げているべきです

遅く逃げる、しばしば逃げる

エスケープとは意図的なことです。URLを出力する場合はesc_urlを使用します。それが間違いなくURLになります(データが悪意のある場合は安全になります)

私がまだ疑問に思っているのは、HTMLフィールドでesc_attrを常に使用するべきか、それとも連絡フォームの入力フィールドを例にするべきかということです。そして、私はいつも私自身のすべてのURLにesc_urlを使うべきです、例えばimage src paths?

ハードコードされたURLの場合例えば。 "http://example.com" いいえ 、安全だとわかっている

それが関数や他のソースからのURLであるならば?例えば。 echo get_permalink()またはecho $url はい、あなたは逃げるべきです それが安全であるかどうかを知る方法はありません

それが内部的に出力し、echoステートメントを必要としない関数ならば?例えば。 the_permalink() いいえ これをエスケープする方法はありません、関数は内部的にエスケープする必要があります。緊急時には出力バッファを使用することができますが、その方法は狂気につながります

そしてthe_title()はどうですか?コード内のすべてのエコーに対して、またはユーザーからの入力がある可能性がある場合にのみ、これらのエスケープのいずれかを使用する必要がありますか?

内部的に出力する関数をエスケープする方法はありません。 the_titleは他のものと同じように使うのがよいでしょう

1つの例外を除いて

bloginfo

セキュリティ上の理由から、この機能は絶対に避けてください。 bloginfoは常に内部的にエスケープするわけではなく、内部的に出力されるのでエスケープを追加する方法はありません。

ソリューション

get_bloginfoを使用して結果をエスケープしてください。

<a href="<?php echo esc_url( get_bloginfo( 'site' ) ); ?>">

get_bloginfoは値を出力するのではなく返すので、エスケープ関数を使うことができます。

フィルタに関する簡単なメモ

the_contentのように物事をフィルタに通したい場合がありますが、結果をエスケープするとタグが削除されます。

たとえば、これにより、存在する埋め込みビデオがすべて削除されます。

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

解決策は、代わりにこれを行うことです。

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

私たちは入力が安全であることを私たちが知っているという考えなので、出力は安全でなければなりません。これは、そのフィルタで実行されているコードもそれに応じてエスケープすることを前提としています。 WP Coreフィルタを使用してこれらの状況でこれを行いますが、できるだけ自分自身のフィルタおよびコードでこれを必要としないようにします。

6
Tom J Nowell

エスケープが必要な値が、通常管理画面にあるようにコードから完全に生成されている場合は、はい、常にエスケープします。

コアのAPIの結果を出力する必要がある場合、状況がより複雑になります。APIから返される値がすでにエスケープされているかどうかを確認するにはコードを調べてください。the_titleはおそらくエスケープされます。 APIを使用してタグ名を取得するには、エスケープする必要があります。

さらに難しい状況は、出力がフィルタやウィジェットで返される値のように、コアの上位層への単なる入力である場合です。フロントエンド側ではウィジェットのタイトルを除いてフォームで得たすべての値をエスケープする必要があるので、ウィジェットは厄介です。

経験則、コアまたはコアテーマに同等の機能がある場合は、それらがエスケープを処理する方法を調べて、同じことを行います。

1
Mark Kaplun