web-dev-qa-db-ja.com

Apply_filters()関数によるサニタイズとデータ検証

以下の例のようにapply_filters()をサニタイズして検証する必要がありますか?

  1. absint( apply_filters( 'slug_excerpt_length', 35 ) );

  2. wp_kses_post( apply_filters( 'slug_excerpt_more', '…' ) );

  3. esc_url( apply_filters( 'slug_login_url', home_url( '/' ) ) );

私はこの質問をしているのですが、これまで見たことがないからです。実際には、ユーザーが子テーマに間違ったものを追加したときに何かが壊れるのを防ぐために検証を追加しています。

あなたはそれについてどう思うかしら。

7
Asaf

ここにいくらかの混乱があります、これらのすべてが検証であるというわけではないので、何が適切であるかを理解するのに必要である2つが他にあります:

  • 検証
  • 除菌
  • 逃げる

除菌

除菌は物事を清潔で整形式にする

これによりデータがクリーンアップされます。末尾のスペースの削除、数字フィールドの文字の削除、すべて小文字のフィールドをすべて小文字にするなど

例えば。ユーザーが" Banana "を入力したので、それを"Banana"に変えます

消毒は、どこか他の場所から来るinputに起こるべき最初のことです。フォームを処理するときは、何かを実行する前にデータをサニタイズします。リモート接続などから来るすべてのデータと同じ

一般的な消毒方法は次のとおりです。

  • wp_kseswp_strip_all_tags etcを介してHTMLまたは特定のタグを削除する
  • 数字以外の文字や句読点などの文字範囲の削除
  • スペースなどの末尾の文字をトリミングする
  • 値を範囲内に制限するなどの制限を適用する(代わりに検証チェックとして実装することもできます)

検証

バリデーションは、物事が有効かどうかをチェックします

検証では、ユーザーが入力した電話番号が実際には電話番号であることを確認します。これはtrueまたはfalseのチェックです。

例えば。ユーザーが選んだフルーツは実際にフルーツですか?

これはサニタイズ後のinputで行われるべきであり、検証が失敗した場合は、一般的な検証方法は次のとおりです。

  • is_numericなどの関数
  • 電話番号やURLのようなものに有用な正規表現、期待されるフォーマットを持つもの
  • ユーザーが実際に意図したアクションを実行できるかどうかを確認するための役割と機能の確認
  • ノンスチェック
  • 定義済みの許容値のホワイトリスト
  • 値の確認は有効範囲内にあります。誰も200文字の長い電話番号を持っていないし、誰かが家の番号に住んでいないでしょう-2000000

逃げる

エスケープは値を出力に対して安全にし、仮定を強制します

遅く逃げる、頻繁に逃げる。

逃げることについてはあまり話されていませんが、上の実例を使って想像してみてください。逃げることは果物の形を切り取ったコンベアベルトのようなものです。あなたはいつも最後に何か果物の形をしています。果物が通り過ぎても手付かずのままですが、悪意のある俳優が通り抜けてしまうと、荒廃した安全な果物の形をしたバージョンが最後に飛び出します。

したがって、エスケープとは仮定を強制することだけです。例えば。 <a>タグでは、href属性にURLを含める必要があります。しかし、そうではないかもしれません。エスケープすることで、「含むべき」を「常に含む」に置き換えることができ、保証が与えられます。これは、誰かが自分のURLを"/>で始めて任意のHTMLを挿入するのを防ぎます。

何も変更されていないことを確認するために、可能な限り最新の時点で、エスケープ処理は常にoutputで行われる必要があります。エスケープも状況依存です。 HTML属性をエスケープするにはesc_attrを使用しますが、それがhrefまたはsrc属性の場合は、出力するURLであることを示すためにesc_urlを使用します。

ダブルエスケープとwp_ksesに関する注意

サニタイズして複数回検証することはできますが、値を1回だけエスケープする必要があります。これは、二重エスケープによって値が二重にエンコードされ、状況によってはコンテンツがエスケープから抜け出す可能性があるためです。

wp_kses_postwp_ksesは、エスケープするため、をサニタイズするために使用でき、値に対して複数回使用できるという点でも変わっています。

早期脱出に関する覚書

これは、ほとんどすべての人間の罪であり、逃げることであなたに与えられたすべてのことをほとんど元に戻すことができます。何かがエスケープされたら、それを出力するのが安全で安全であることを知っています。それを変数に代入すればbut、エスケープと出力の間に起こることがあることを知っています。その変数が変更されたり、関数に渡されたり、フィルタを通してパイプされたりした場合、それはもはや安全ではなく、ステータスは謎です。再びそれを回避することはできますが、今は二重にエスケープしたので、安全なデータを危険なものにしたり、良いデータを破壊したりしたかもしれません。

これらのフィルタについて

以下の例のようにapply_filters()をサニタイズして検証するべきですか?

状況によります

入力時:

  • 消毒する
  • それから検証する
  • 有効であれば続行し、そうでなければ拒否します

ブラウザへの出力時に/ requests/etc:

  • データベースから取得したサニタイズと検証は、必要に応じて実行できますが、#1の優先順位は、エスケープし、一度だけエスケープし、出力時に実行することです。変数に格納しないでください。早いうちにエスケープして危険です
  • フィルタから値が返されると、フィルタが既知の安全な値に対して何を行ったのかを知っているのではなく、フィルタ処理後にエスケープします。その安全性とステータスは謎です。
  1. absint( apply_filters( 'slug_excerpt_length', 35 ) );

私たちは今、この値が間違いなく数であり、正の数であることを知っています。このステートメントの先頭にechoを付けると、安全なエスケープ値になります。さもなければそれは価値をきれいにすることはただ消毒です。

  1. wp_kses_post( apply_filters( 'slug_excerpt_more', '&hellip;' ) );

すぐに出力すると、これはサニタイズとエスケープの両方になりますが、変数に保存すれば、単にサニタイズするだけです。

  1. esc_url( apply_filters( 'slug_login_url', home_url( '/' ) ) );

これはエスケープされており、echoステートメントが必要です。これを変数に代入すると、そのエスケープは無駄になり、不安定な状況が発生します。

一方、問題がある場合は、フィルタの戻り値を二重チェックする必要がありますか?はい、それは賢い方法ですが、慎重過ぎるでしょう。そのシナリオでは、これは適切に実装されていないフィルタのテストになると思います。数値が予想される場所にテキストを返します。このシナリオでは、検証が唯一の選択肢であり、エスケープ処理と除菌処理は不適切です。

例外

  • the_contentフィルタを使用するとき、wp_kses_postを通して値を渡して、それからそれをフィルタとすぐにエコーに渡してください。 echo apply_filters( 'the_content', wp_kses_post( $dangerous ) );
  • ショートコードでは、文字列を返すことができるように、必要ならばエスケープして出力バッファを使う
16
Tom J Nowell