「安全」な値や「安全でない」値などはありません。サーバーが制御する値とユーザーが制御する値だけがあり、値の取得元を認識する必要があるため、特定の目的で信頼できるかどうかを確認する必要があります。$_SERVER['HTTP_FOOBAR']
たとえば、データベースに保存することは完全に安全ですが、私は間違いなくそうしませんeval
。
そのため、これらの値を3つのカテゴリーに分けましょう。
サーバー制御
これらの変数はサーバー環境によって設定され、サーバー構成に完全に依存します。
'GATEWAY_INTERFACE'
'SERVER_ADDR'
'SERVER_SOFTWARE'
'DOCUMENT_ROOT'
'SERVER_ADMIN'
'SERVER_SIGNATURE'
部分的にサーバー制御
これらの変数は、クライアントが送信した特定のリクエストに依存しますが、すべての無効な値はWebサーバーによって拒否され、スクリプトの呼び出しを開始させないため、限られた数の有効な値しか取ることができません。したがって、それらは信頼できると見なすことができます。
'HTTPS'
'REQUEST_TIME'
'REMOTE_ADDR'
*
'REMOTE_HOST'
*
'REMOTE_PORT'
*
'SERVER_PROTOCOL'
'HTTP_HOST'
†
'SERVER_NAME'
†
'SCRIPT_FILENAME'
'SERVER_PORT'
‡
'SCRIPT_NAME'
*これらのREMOTE_
値は、TCP / IPハンドシェイクによって検証されるように、クライアントの有効なアドレスであることが保証されています。これは、応答が送信されるアドレスです。REMOTE_HOST
ただし、逆DNSルックアップに依存しているため、サーバーに対するDNS攻撃によってスプーフィングされる可能性があります(この場合は、とにかく大きな問題が発生します)。この値はプロキシである場合があります。これは、TCP / IPプロトコルの単純な現実であり、何も実行できません。
†Webサーバーがヘッダーに関係なく要求に応答する場合HOST
、これも安全ではないと見なされます。$ _SERVER [“ HTTP_HOST”]の安全性を参照してください。。http://shiflett.org/blog/2006/mar/server-name-versus-http-host
も参照してください。
‡参照https://bugs.php.net/bug.php?id=64457、http://httpd.apache.org/docs/current/mod/core.html#usecanonicalphysicalport、//httpd.apacheます。http。 org / docs / 2.4 / mod / core.html#comment_999
完全に任意のユーザー制御値
これらの値はまったくチェックされず、サーバー構成に依存しません。これらは、クライアントから送信される完全に任意の情報です。
'argv'
、'argc'
(CLI呼び出しにのみ適用され、通常はWebサーバーには関係ありません)
'REQUEST_METHOD'
§
'QUERY_STRING'
'HTTP_ACCEPT'
'HTTP_ACCEPT_CHARSET'
'HTTP_ACCEPT_ENCODING'
'HTTP_ACCEPT_LANGUAGE'
'HTTP_CONNECTION'
'HTTP_REFERER'
'HTTP_USER_AGENT'
'AUTH_TYPE'
‖
'PHP_AUTH_DIGEST'
‖
'PHP_AUTH_USER'
‖
'PHP_AUTH_PW'
‖
'PATH_INFO'
'ORIG_PATH_INFO'
'REQUEST_URI'
(汚染されたデータが含まれている可能性があります)
'PHP_SELF'
(汚染されたデータが含まれている可能性があります)
'PATH_TRANSLATED'
- その他の
'HTTP_'
値
§Web サーバーが特定のリクエストメソッドのみを許可している限り、信頼できると見なされます。
authentication認証が完全にWebサーバーによって処理される場合、信頼できると見なされます。
スーパーグローバル$_SERVER
には、いくつかの環境変数も含まれています。これらが「安全」であるかどうかは、それらの定義方法(および場所)に依存します。完全にサーバー制御から完全にユーザー制御までさまざまです。