以下の例のようにapply_filters()
をサニタイズして検証する必要がありますか?
absint( apply_filters( 'slug_excerpt_length', 35 ) );
wp_kses_post( apply_filters( 'slug_excerpt_more', '…' ) );
esc_url( apply_filters( 'slug_login_url', home_url( '/' ) ) );
私はこの質問をしているのですが、これまで見たことがないからです。実際には、ユーザーが子テーマに間違ったものを追加したときに何かが壊れるのを防ぐために検証を追加しています。
あなたはそれについてどう思うかしら。
ここにいくらかの混乱があります、これらのすべてが検証であるというわけではないので、何が適切であるかを理解するのに必要である2つが他にあります:
除菌は物事を清潔で整形式にする
これによりデータがクリーンアップされます。末尾のスペースの削除、数字フィールドの文字の削除、すべて小文字のフィールドをすべて小文字にするなど
例えば。ユーザーが
" Banana "
を入力したので、それを"Banana"
に変えます
消毒は、どこか他の場所から来るinputに起こるべき最初のことです。フォームを処理するときは、何かを実行する前にデータをサニタイズします。リモート接続などから来るすべてのデータと同じ
一般的な消毒方法は次のとおりです。
wp_kses
wp_strip_all_tags
etcを介してHTMLまたは特定のタグを削除するバリデーションは、物事が有効かどうかをチェックします
検証では、ユーザーが入力した電話番号が実際には電話番号であることを確認します。これはtrue
またはfalse
のチェックです。
例えば。ユーザーが選んだフルーツは実際にフルーツですか?
これはサニタイズ後のinputで行われるべきであり、検証が失敗した場合は、一般的な検証方法は次のとおりです。
is_numeric
などの関数-2000000
エスケープは値を出力に対して安全にし、仮定を強制します
遅く逃げる、頻繁に逃げる。
逃げることについてはあまり話されていませんが、上の実例を使って想像してみてください。逃げることは果物の形を切り取ったコンベアベルトのようなものです。あなたはいつも最後に何か果物の形をしています。果物が通り過ぎても手付かずのままですが、悪意のある俳優が通り抜けてしまうと、荒廃した安全な果物の形をしたバージョンが最後に飛び出します。
したがって、エスケープとは仮定を強制することだけです。例えば。 <a>
タグでは、href
属性にURLを含める必要があります。しかし、そうではないかもしれません。エスケープすることで、「含むべき」を「常に含む」に置き換えることができ、保証が与えられます。これは、誰かが自分のURLを"/>
で始めて任意のHTMLを挿入するのを防ぎます。
何も変更されていないことを確認するために、可能な限り最新の時点で、エスケープ処理は常にoutputで行われる必要があります。エスケープも状況依存です。 HTML属性をエスケープするにはesc_attr
を使用しますが、それがhref
またはsrc
属性の場合は、出力するURLであることを示すためにesc_url
を使用します。
wp_kses
に関する注意サニタイズして複数回検証することはできますが、値を1回だけエスケープする必要があります。これは、二重エスケープによって値が二重にエンコードされ、状況によってはコンテンツがエスケープから抜け出す可能性があるためです。
wp_kses_post
とwp_kses
は、エスケープするため、とをサニタイズするために使用でき、値に対して複数回使用できるという点でも変わっています。
これは、ほとんどすべての人間の罪であり、逃げることであなたに与えられたすべてのことをほとんど元に戻すことができます。何かがエスケープされたら、それを出力するのが安全で安全であることを知っています。それを変数に代入すればbut、エスケープと出力の間に起こることがあることを知っています。その変数が変更されたり、関数に渡されたり、フィルタを通してパイプされたりした場合、それはもはや安全ではなく、ステータスは謎です。再びそれを回避することはできますが、今は二重にエスケープしたので、安全なデータを危険なものにしたり、良いデータを破壊したりしたかもしれません。
以下の例のように
apply_filters()
をサニタイズして検証するべきですか?
状況によります
入力時:
ブラウザへの出力時に/ requests/etc:
absint( apply_filters( 'slug_excerpt_length', 35 ) );
私たちは今、この値が間違いなく数であり、正の数であることを知っています。このステートメントの先頭にecho
を付けると、安全なエスケープ値になります。さもなければそれは価値をきれいにすることはただ消毒です。
wp_kses_post( apply_filters( 'slug_excerpt_more', '…' ) );
すぐに出力すると、これはサニタイズとエスケープの両方になりますが、変数に保存すれば、単にサニタイズするだけです。
esc_url( apply_filters( 'slug_login_url', home_url( '/' ) ) );
これはエスケープされており、echo
ステートメントが必要です。これを変数に代入すると、そのエスケープは無駄になり、不安定な状況が発生します。
一方、問題がある場合は、フィルタの戻り値を二重チェックする必要がありますか?はい、それは賢い方法ですが、慎重過ぎるでしょう。そのシナリオでは、これは適切に実装されていないフィルタのテストになると思います。数値が予想される場所にテキストを返します。このシナリオでは、検証が唯一の選択肢であり、エスケープ処理と除菌処理は不適切です。
the_content
フィルタを使用するとき、wp_kses_post
を通して値を渡して、それからそれをフィルタとすぐにエコーに渡してください。 echo apply_filters( 'the_content', wp_kses_post( $dangerous ) );