0

誰かが以前にこれを尋ねたと確信していますが、同様の投稿が見つかりません。

$_GET 変数から ID フィールドを検証する必要性は? is_numeric() を使用して、少なくとも数値を取得していることを確認していますが、不要なコードを入れているだけですか?

元。

www.test.com/user.php?user_id=5

if (isset($_GET['user_id']) && is_numeric($_GET['user_id'])) {
  *PDO query for user information*
}

is_numeric() は必要ですか?
アドレスの user_id を変更することによる攻撃の可能性はありますか?

4

5 に答える 5

2

数値 ID をサニタイズする最善の方法は、(int)キャストを使用することです。

$id = (int) $_GET['ID'];

あなたが決して知らない文字列

is_int()必要ですか?

ID によるデータの取得を探している可能性があります。したがって、文字列を に変換するのintが最も簡単な方法です。ちなみに、文字列に適用すると、is_int 常に false が返されます。

アドレスの user_id を変更することによる攻撃の可能性はありますか?

まあ、弦はいつも汚れています。ユーザーがどのような奇妙な文字を入力する可能性があり、それがクエリにどのように影響するかはわかりません。たとえば、この場合に適用できるかどうかはわかりませんが、NULL バイト攻撃を見てください。

于 2013-05-08T02:01:52.573 に答える
1

準備済みステートメントを使用したくない場合は、PDO::quote が適切な関数である必要があります。

理論的に安全に SQL ステートメントに渡せる引用符付き文字列を返します。

于 2013-05-08T02:02:58.610 に答える
0

is_int変数の型を確認してください。ただし、 $_GET['id'] は常に文字列になります。filter_varを使用することをお勧めします。

ただし、とにかく準備済みステートメントを使用する必要があります。

PS準備されたステートメントでは、検証を使用できません。DB は、何も見つからなかったことを通知します。ただし、不正なリクエストについてユーザーに警告する場合は、クエリを実行する前に検証する必要があります。

于 2013-05-08T02:02:46.823 に答える
0

is_intGET変数は常に文字列として渡されるため、機能しません。

個人的には、有効な整数をテストするのが好きです:

if(strval(intval($_GET['user_id'])) === $_GET['user_id'])

ただし、これはやり過ぎになる可能性があります。結局のところ、プリペアド ステートメントを使用している場合、エスケープを処理する必要はなく、存在しない行を検索しても結果は返されません。をintval($_GET['user_id'])入れますが、ID が数字であることを将来のコーダーに明確にするためだけです。

于 2013-05-08T02:02:44.550 に答える