web-dev-qa-db-ja.com

SQLインジェクションを防ぐためにIPアドレスを検証する必要がありますか?

PHP私はユーザーのIPアドレス(_$_SERVER['REMOTE_ADDR']_)を取得して一部のMySQLクエリで使用します)を行いますnot真のIPアドレスであることを検証します。

MySQLクエリで使用する前にユーザーIPアドレスを検証する必要がありますか、または_$_SERVER['REMOTE_ADDR']_を使用する場合は常に有効なIPアドレスになりますか? SQLインジェクションを防止しようとしています。

検証する必要がある場合、どのPHP関数を使用することをお勧めしますか?mysqli_real_escape_string()などを使用してIPアドレスを送信する必要がありますか?

12
Hope4You

SQLインジェクションを防ぐには、準備済みステートメントを使用する必要があります。 この質問 を見てください。

しかしながら、 $_SERVER['REMOTE_ADDR']は、TCPハンドシェイクによって確認されたように、サーバーからの有効なIPアドレスである必要があります。これに関する詳細な説明については、 この質問 を参照してください。

14
Oleksi

このページ から、$ _ SERVER配列のREMOTE_ADDR要素は、クライアントによって渡されるのではなく、サーバーによって入力されるように見えるので、(バグがない限り)妥当な仮定である必要がありますリモートクライアント(またはリモートクライアントの代わりに動作するプロキシサーバー)のIPアドレス。

@ Lucb1eが以下にコメントしているように、$ _ SERVER配列の一部の要素はクライアントからのものであり、信頼性は低いはずです

@OleksiがSQLクエリへの入力を信頼しないことを言及しているように、一般的に良い考えです。

6
Rory McCune

REMOTE_ADDRは、受信側のTCP=スタックによって決定されます-クライアントから「送信」されたデータではありません。IPv4もipv6も、SQLで安全でない/区切り式の文字を使用しません。

ただし、IPアドレス(つまり、xxx.xxx.xxx.xxxまたはxxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx)を保存する意味がほとんどないため、数値の方がはるかに有用であり、必要なストレージも少なくなります。 inet_aton()およびinet6_aton()関数のマニュアル。

3
symcbean