将客户IP插入数据库。

15 浏览
0 Comments

将客户IP插入数据库。

如何使用PHP获取客户端IP地址?\n我想通过IP地址记录登录我的网站的用户。

0
0 Comments

问题的出现原因:

用户想要获取访问他的网站的客户端的IP地址,而不是服务器的IP地址。

解决方法:

使用

$_SERVER['REMOTE_ADDR']

来获取客户端的IP地址。

在开发网站时,有时我们需要获取访问我们网站的客户端的IP地址。我们可以使用

$_SERVER['REMOTE_ADDR']

来获取这个信息。这个变量是PHP预定义的超全局变量,存储了客户端的IP地址。

在一些情况下,我们可能会遇到一些问题。例如,当我们在本地开发环境中运行网站时,

$_SERVER['REMOTE_ADDR']

返回的是::1,而不是我们期望的客户端的真实IP地址。这是因为::1是IPv6中127.0.0.1的等价地址。

如果我们想要获取客户端的真实IP地址,而不是代理服务器的IP地址,我们可以参考stackoverflow上的一些解决方案。具体的解决方法可以参考这个链接:stackoverflow.com/questions/10517371/…

0
0 Comments

问题的出现原因是$_SERVER['REMOTE_ADDR']可能不是实际的客户端IP地址,因为它会给出通过代理连接的客户端的代理地址。根据你对IP的处理方式,这可能是你真正想要的,不过,如果你尝试查看流量的来源或者记住用户上次连接的IP地址,某人的私有RFC1918地址可能对你没有任何用处,而代理或NAT网关的公共IP可能更适合存储。

解决方法是使用一些HTTP头,如X-Forwarded-For,这些头可能会被各种代理设置,但问题在于这些只是可以被任何人设置的HTTP头,对于它们的内容没有保证。$_SERVER['REMOTE_ADDR']是Web服务器收到连接的实际物理IP地址,并且响应将发送到该地址。其他任何内容都只是任意和自愿提供的信息。只有一种情况下你可以相信这些信息:你控制设置这个头的代理。也就是说,只有当你百分之百确定头是在哪里和如何设置时,你才应该对其进行重视。

以下是一些示例代码:

if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
    $ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
    $ip = $_SERVER['REMOTE_ADDR'];
}

编辑注意:使用上述代码有安全隐患。客户端可以设置所有的HTTP头信息(例如$_SERVER['HTTP_...'])为任意值。因此,使用$_SERVER['REMOTE_ADDR']要可靠得多,因为用户无法设置它。

不要使用上面的代码,除非你确切知道它的作用!我曾经看到由于这个代码导致的巨大安全漏洞。客户端可以将X-Forwarded-For或Client-IP头设置为任意值。除非你有一个受信任的反向代理,否则不应该使用这些值。

关于Janoszen的评论,一种选择是使用PHP的filter_var($_SERVER['REMOTE_ADDR'], FILTER_VALIDATE_IP)。

X-Forwarded-For可以包含多个以逗号分隔的IP地址,而且应该对其进行解析而不是直接使用(据我所知,它几乎从不包含单个IP)。

这是一个合理的做法,它会使它更可靠,但不幸的是,它仍然允许欺骗。

不要使用上面的代码,它可能是由HTTP_X_FORWARDED_FOR伪造的,伪造的地址使用代理。请不要使用上面的代码!

不,remote_addr从TCP中获取IP。无法通过TCP欺骗IP,因为它需要握手。

你是对的。如果我记得我的思路,我只是想说这个建议不能帮助你判断它是否真的是客户端。我不认为我当时考虑到了伪造的数据包,但是我真的记不清了。

你也是对的。它不能帮助你判断它是否是客户端。它可能是6to4网关、NAT网关、TOR代理或任何一台设备或代理,它们将不提供有效的X-Forwarded-For头,并且即使它们提供,也无法验证它是否正确,因为这是不可靠的数据。这就是为什么这种类型的数据只应该用于分析,其中精确的数字是可以接受的。

对于一个规模较大的网站,将有负载均衡器和/或反向代理位于Web应用服务器的前面。你必须配置这些负载均衡器或代理,删除任何外部的X-Forwarded-For头,而是插入它们自己看到的连接客户端的IP地址。

此外,如果你的应用服务器由CDN(如Akamai、CloudFlare等)提供支持,那么你看到的远程IP可能来自CDN。你必须确保CDN插入一个你可以信任的、不能被恶意客户端伪造的头。

关于lostphilosopher的评论。你不需要验证$_SERVER['REMOTE_ADDR']的格式。它是从服务器连接获取的,所以不能被攻击者控制。你也不能伪造这个值(否则你将无法完成TCP握手)。而Janos Pasztor提到的安全问题主要不是输入验证漏洞,如XSS...一个更紧迫的问题是测试'127.0.0.1'以向本地用户显示管理员面板。使用上面的代码,攻击者可以在'HTTP_CLIENT_IP'头中放置127.0.0.1来绕过限制并获得访问权限。

0
0 Comments

问题:如何将客户IP插入数据库?

原因:为了确保数据的准确性和安全性,不能完全信任来自客户端的数据。$_SERVER['REMOTE_ADDR']包含了连接方的真实IP地址,是最可靠的值。但是,如果客户端使用代理服务器连接,那么代理服务器可能会设置$_SERVER['HTTP_X_FORWARDED_FOR'],但是这个值很容易被伪造。例如,没有代理服务器的人也可以设置这个值,或者IP地址可以是代理服务器后面的局域网的内部IP。

解决方法:如果要保存$_SERVER['HTTP_X_FORWARDED_FOR'],确保同时保存$_SERVER['REMOTE_ADDR']的值。可以在数据库中使用不同的字段保存这两个值。

如果要将IP保存为字符串型数据,确保至少预留45个字符的空间。IPv6已经普及了,它的地址长度比旧的IPv4地址要长。

注意:IPv6通常最多使用39个字符,但是对于IPv4地址,有一种特殊的IPv6表示方法,它的全格式可以达到45个字符。所以,如果你知道自己在做什么,可以使用39个字符,但是如果你只想设置一次并且忘记它,那就使用45个字符。

额外说明:REMOTE_ADDR可能不包含TCP连接的真实IP地址,这完全取决于你的SAPI(服务器API)。确保你的SAPI已正确配置,以便$_SERVER['REMOTE_ADDR']实际返回TCP连接的IP地址。否则可能会导致一些严重的漏洞,例如,StackExchange曾经通过检查REMOTE_ADDR是否与"localhost"匹配来授予管理员访问权限,不幸的是,SAPI的配置存在漏洞(它接受HTTP_X_FORWARDED_FOR作为输入),这使得非管理员可以通过修改HTTP_X_FORWARDED_FOR头部获得管理员访问权限。另请参阅blog.ircmaxell.com/2012/11/anatomy-of-attack-how-i-hacked.html。

我尝试了echo所有的变量,$_SERVER["HTTP_CLIENT_IP"]; $_SERVER['REMOTE_ADDR']; $_SERVER['HTTP_X_FORWARDED_FOR']; $_SERVER['HTTP_X_FORWARDED']; $_SERVER['HTTP_FORWARDED_FOR']; $_SERVER['HTTP_FORWARDED']; and $_SERVER['HTTP_X_CLUSTER_CLIENT_IP']; - 唯一一个在直接通过浏览器和通过代理服务器访问时都返回一些IP值的是REMOTE_ADDR变量。其他六个变量都是空白的。这里有什么问题吗?

重要提示:不要将IP用于PHP安全性。如果需要限制IP访问,请在网络层面上进行设置。

0