PHP
クライアントのIPアドレスを検出する方法
サーチ…
HTTP_X_FORWARDED_FORの適切な使用
最新のhttpoxyの脆弱性に照らして 、広く誤用されている別の変数があります。
HTTP_X_FORWARDED_FOR
はクライアントのIPアドレスを検出するために使用されることがよくありますが、これを確認する必要はありません。特にこのIPを後で認証やSQL照会に使用する場合にセキュリティ上の問題が発生します。
利用可能なコードサンプルのほとんどは、 HTTP_X_FORWARDED_FOR
が実際にクライアント自体によって提供される情報とみなされ、したがってクライアントIPアドレスを検出する信頼できるソースではないという事実を無視しています。サンプルの中には、誤用の可能性についての警告を追加するものもありますが、コード自体に追加のチェックはまだありません。
ですから、PHPで書かれた関数の例、クライアントがプロキシの背後にいるかも知っていて、このプロキシを信頼できると知っている場合、クライアントのIPアドレスを検出する方法です。信頼できるプロキシがわからない場合は、 REMOTE_ADDR
function get_client_ip()
{
// Nothing to do without any reliable information
if (!isset($_SERVER['REMOTE_ADDR'])) {
return NULL;
}
// Header that is used by the trusted proxy to refer to
// the original IP
$proxy_header = "HTTP_X_FORWARDED_FOR";
// List of all the proxies that are known to handle 'proxy_header'
// in known, safe manner
$trusted_proxies = array("2001:db8::1", "192.168.50.1");
if (in_array($_SERVER['REMOTE_ADDR'], $trusted_proxies)) {
// Get IP of the client behind trusted proxy
if (array_key_exists($proxy_header, $_SERVER)) {
// Header can contain multiple IP-s of proxies that are passed through.
// Only the IP added by the last proxy (last IP in the list) can be trusted.
$client_ip = trim(end(explode(",", $_SERVER[$proxy_header])));
// Validate just in case
if (filter_var($client_ip, FILTER_VALIDATE_IP)) {
return $client_ip;
} else {
// Validation failed - beat the guy who configured the proxy or
// the guy who created the trusted proxy list?
// TODO: some error handling to notify about the need of punishment
}
}
}
// In all other cases, REMOTE_ADDR is the ONLY IP we can trust.
return $_SERVER['REMOTE_ADDR'];
}
print get_client_ip();
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow