【发布时间】:2013-01-29 22:54:52
【问题描述】:
我有两个问题:
1) 在 PHP 中,当程序员使用“REMOTE_ADDR”变量获取 Web 客户端的 IP 地址时,该 IP 地址是从 HTTP 标头中的字段获取的吗?还是从哪里来的?
2) 如果客户端的 IP 地址是从 HTTP 标头中获取的,Web 客户端可以“欺骗”或“更改”HTTP 标头以隐藏其真实 IP 地址吗?
非常感谢。
【问题讨论】:
我有两个问题:
1) 在 PHP 中,当程序员使用“REMOTE_ADDR”变量获取 Web 客户端的 IP 地址时,该 IP 地址是从 HTTP 标头中的字段获取的吗?还是从哪里来的?
2) 如果客户端的 IP 地址是从 HTTP 标头中获取的,Web 客户端可以“欺骗”或“更改”HTTP 标头以隐藏其真实 IP 地址吗?
非常感谢。
【问题讨论】:
REMOTE_ADDR 取自 TCP/IP 连接,很难进行欺骗。
但是,如果您的服务器位于反向代理之后,则可能不准确。在这种情况下,您必须阅读 X-Forwarded-For 标头,如果您的代理并不总是覆盖它,那么很容易被欺骗。
【讨论】:
$_SERVER["REMOTE_ADDR"] : 如前所述,从 TCP 连接中的 IP 套接字获取 IP... 欺骗您的真实 IP 的方法很容易,例如使用远程服务器: 'TOR 网络'。
示例: 如果我想向站点服务器发送请求(但我需要欺骗我的 IP),我使用:
<?php
$ip = '127.0.0.1';
$port = '9051';
$auth = 'PASSWORD';
$command = 'signal NEWNYM';
$fp = fsockopen($ip,$port,$error_number,$err_string,10);
if(!$fp) { echo "ERROR: $error_number : $err_string";
return false;
} else {
fwrite($fp,"AUTHENTICATE \"".$auth."\"\n");
$received = fread($fp,512);
fwrite($fp,$command."\n");
$received = fread($fp,512);
}
fclose($fp);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://whatismyip.org"); //ipimg.php
curl_setopt($ch, CURLOPT_PROXY, "127.0.0.1:9050");
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_VERBOSE, 0);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>
此代码演示了我如何使用使用 SOCKS5 / SOCKS4 的 TOR 服务来欺骗我的 IP 在不使用我的真实 IP 的情况下向另一台服务器发送请求。 我正在使用 whatismyip.org 对其进行测试以查看 IP 更改。
玩得开心。
【讨论】:
1) $_SERVER["REMOTE_ADDR"] 直接来自 TCP 连接。
2) $_SERVER["REMOTE_ADDR"] 只能在非 SSL TCP 连接上使用中间人攻击进行欺骗(SSL 握手有一些防止 IP 欺骗的保护)。
2) 来自 HTTP 标头的 $_SERVER 变量以 HTTP_ 为前缀,是的,如果它们包含 IP 地址,它们可以被调用者轻易欺骗。您永远不应该相信包含 IP 地址的 $_SERVER["HTTP_*"] 变量。
【讨论】: