3

[] で終わる名前を持つ入力を含む html フォームを投稿すると、php はこれらの $_POST 値を自動的に配列にします。

たとえば、括弧なし:

<input name="email" value="a" />

var_dump($_POST["email"])    
//string 'a' (length=1)

ブラケット付き:

<input name="email[]" value="a" />
<input name="email[]" value="b" />

var_dump($_POST["email"])    
//array
//  0 => string 'a' (length=1)
//  1 => string 'b' (length=1)

私の問題は、以前はこれについて知らなかったため、$_POST 変数は常に文字列型であるという前提で Web サイトをコーディングしていたことです。当然、標準入力の検証を実行しますが、変数が既に文字列であることを前提としています。

では、ハッカーが私の通常の入力の 1 つを取得<input name="email" .../>し、その後に括弧を付けて投稿した場合はどうなるでしょうか。次に、$_POST["email"] をフェッチする私のコードは配列になります!

これがセキュリティ上の問題になる場合があると想像できます。たとえば、startsWith-function は文字列と配列の両方で機能する可能性があります。すべての $_POST 変数が常に文字列であると信頼できるように、関数を完全に無効にしたいだけです。

この機能をグローバルに無効にする方法はありますか、または $_POST のすべてのアクセスの前にすべて検索置換して (文字列) キャストを追加する唯一のオプションですか?

4

1 に答える 1

0

POST 配列をループして、この方法で修正できます。しかし、これを必要とするつもりはないと言ったので、_POST 配列をループして、文字列以外のものがあるかどうかを確認してから、例外をスローしてみませんか? 架空のハッカーに素晴らしいフォールバックや回避策を提供する必要はありません:)

foreach($_POST as $val) {
   if (!is_string($val)) {
      throw new InvalidArgumentException('POST arguments should be strings only');
   }
}

このような問題に対処する最善の方法は、厳格であり、クライアント (ブラウザー/悪者) が明らかに何かをいじっている場合に例外をスローすることです ;)

于 2012-08-09T09:20:04.730 に答える