web-dev-qa-db-ja.com

単純な数値スーパーグローバル(CookieとPost)を検証、サニタイズ、またはフィルタ処理する必要がありますか?

私はブラウザのクッキーにUNIXの日時を格納し、また現在のWordPress投稿のID番号を送信する単純なフォームに基づいて$ _POST変数を使用するプラグインを書いています。

WordPressとPHPでのサニタイズとバリデーションに関する記事や記事をいくつか読んだ後、このようにCookieデータを処理することに関してほとんど、あるいはまったく対処しているものは見つかりませんでした。隠しフィールドを介してプログラム的に設定された単純な$ _POST変数は、おそらく検証またはエスケープする必要はないでしょう。

クッキー

JSONを使用して、プラグインはキーとしてPost-IDを、値としてUNIX datetimeを持つ単純な配列を含む3つのcookieを設定およびデコードします。条件付きで互いに比較されることに加えて、日時は変換されて表示されることがあります。

NetBeansでは、次のようにコードが設定されているかどうかを確認しているときでも、コードでCOOKIE変数を使用するたびに「スーパーグローバルCOOKIE配列に直接アクセスしない」という警告が表示されます。

if (isset($_COOKIE['new_session'])) {
    //stuff
}

(はい、プラグインやその他のコードを介してWordPressの$ _SESSIONを有効にすることもできます - その方法に反対しましたが、それでも理由がある場合は考えを変更するように説得される可能性があります。そうする!)

データを抽出するときにも警告が表示されます。

$prev_visit = json_decode( stripslashes( $_COOKIE['prev_visit'] ), true );

編集:UNIXのdatetimeは、結果の$prev_visit配列からの値としてアクセスされます。したがって、日時を取得するには、$prev_visit[$id]を使用します。$ idは、get_the_ID()から直接または間接的に(以下のように$ _POST変数を介して)派生するWP Post-ID番号キーとして機能します。

POST可変

$ _POSTデータに関しては、私が言ったように、それは簡単なフォームを介して作成されます:ユーザーがボタンを押すと、隠された入力は "mark-all-read"値としてWordpress Post ID番号を送ります。キーライン:

$id = get_the_ID();

そして、PHP内でボタン/フォームを作成します。

$mark-all-read-button .= '<input type="hidden" name="mark-all-read" value="' . $id . '" />';

次回の更新時( "init"に追加されたアクション)、'mark-all-read'が設定されているかどうかをチェックし、設定されている場合は、より一般的な例のように$ idを使用して上記のクッキーのキーを設定します。 (これは、get_the_ID()を介して派生したID番号を「間接的に」使用することによって意味したものです。)

これがこのプラグインの目的を達成するための最良の方法であるかどうかはわかりませんが、これまでのところうまく機能します。しかし、世界と共有する前に、それが安全に使用できるかどうかを知りたいです。

質問

それでは、上で使用したようにスーパーグローバルを検証および/またはサニタイズする必要がありますか?そして、もしそうなら、どの程度正確に?

1
CK MacLeod

タイトルからちょうど質問を読まずに、答えはYESです。外部からの入力はすべて適切な場合に検証およびサニタイズする必要があります。これには、サーバーが設計した形式で生成されたmightが不適切であるという事実が含まれます。 。入力は決して信頼されるべきではありません。

今内部の一貫性について。入力フィールドを既に検証してサニタイズした後は、データが処理すると予想されるコンテキスト内でデータが意味を成していることを確認する必要があります。投稿の投稿IDが必要な場合は、それが実際に存在するだけでなく、ページではないことも確認する必要があります。これは実際には検証のもう1つの側面です...そしてコードパスでそれを早くそしてエラーメッセージをより詳細に行うほど、あなたの人生はより簡単になるでしょう。

それで、それをどのように正確にやるのですか?レシピはありません、文脈が異なると検証や衛生管理も異なります。できるだけ厳密に始めてから、チェックがある場合にのみチェックを緩和することをお勧めします。

2
Mark Kaplun