如何在PHP中唯一识别远程机器?

时间:2009-07-29 04:46:43

标签: php

如何在代理服务器环境中唯一识别远程机器,我使用了$ _SERVER ['REMOTE_ADDR'],但代理网络中的所有机器都有相同的IP地址,有什么办法

7 个答案:

答案 0 :(得分:11)

不要依赖来自客户的信息。在这种情况下,您遇到了简单的网络问题(您永远无法确定客户端的IP地址是否正确),在其他情况下,客户端可能会故意欺骗信息。

如果您需要唯一识别您的客户,请在第一次访问时给他们一个cookie,这是您可以做的最好的。

答案 1 :(得分:7)

你最好的选择是:

 $uid = md5($_SERVER['HTTP_USER_AGENT'] .  $_SERVER['REMOTE_ADDR']);

但是,无法知道他们是否更改了用户代理或其他浏览器。

答案 2 :(得分:4)

你可以使用其他一些标题来帮助,比如这些标题(在查看$_SERVER转储时会想到的标题):

  • HTTP_USER_AGENT
  • HTTP_ACCEPT
  • HTTP_ACCEPT_LANGUAGE
  • HTTP_ACCEPT_ENCODING
  • HTTP_ACCEPT_CHARSET

使用来自客户端的多个信息将有助于区分不同的客户(您使用的信息越多,您在两个客户端中至少有一个不同的机会就越多)......

......但这不是一个完美的解决方案: - (

根据代理软件的类型及其配置,可能会有一个名为X-Forwarded-For的标题,您可以使用:

  

X-Forwarded-For(XFF)HTTP标头   是事实上的识别标准   客户端的原始IP地址   通过连接到Web服务器   HTTP代理或负载均衡器。这是一个   非RFC标准请求标头   是由Squid缓存引入的   代理服务器的开发人员。

但我也不会依赖它:它可能并不总是存在(不要认为它是'必需的)

祝你好运!

答案 3 :(得分:1)

目前没有办法做到这一点,因为您没有获得有关 MAC 地址的信息,即使这样也可能是错误的,就像有 2 个网卡一样,有线或无线。

最好的办法是在本地让 JavaScript 写入和读取到本地存储,并使用 Ajax 命令将保存的设置发送回您的服务器。这仍然不完美,好像他们清除了缓存,设置丢失了。

答案 4 :(得分:0)

我认为还有其他方法可以做你想做的事。这是因为代理服务器代理客户端的请求并代表他们行事。因此,从服务器的角度来看,客户实际上是隐藏的。但是,我可能错了。

答案 5 :(得分:0)

如果您了解代理服务器,我认为这意味着这是某种公司局域网。你在控制局域网吗?也许构建和安装一些可以向服务器发送机器唯一ID的ActiveX插件可能就是解决方案。

通常,HTTP代理服务器需要发送其客户端的IP。因此,代理发送的每个请求看起来都来自代理的IP。 (虽然维基百科提到了自定义标题,但有些代理会发送转发client's ip。)

当HTTP代理本身使用另一个HTTP代理时,情况变得更糟 - 获取请求的服务器将只获取链中最后一个代理的IP,并且不能保证第二个代理甚至意识到第一个代理不是常客!

答案 6 :(得分:0)

JKS,

远程计算机没有唯一标识符。这是不可能的。

通常开发人员喜欢在最终用户出于安全原因访问具有登录表单的页面时跟踪计算机。

这是我的工作:我存储一个cookie,一个会话变量,并使用新的html5 localStorage来跟踪敏感页面上的人。这确实是准确做到这一点的唯一方法。关于localStorage的好处(当浏览器可以这样做时),最终用户通常不知道你在他们的机器上存储东西并删除co​​okie没有效果。

因此,您可以创建一个包含跟踪详细信息的数据库表: timestamp,ip_address,user_agent

然后假设您正在跟踪失败的登录尝试..我会这样做:

if(isset($_SESSION['failed_logins'])) {
        $failed_logins = $_SESSION['failed_logins'];
        $_SESSION['failed_logins'] = ($failed_logins + 1);
} else {
        $_SESSION['failed_logins'] = 1;
}

然后我会用setcookie()和localStorage脚本做同样的事情。

现在我正在跟踪此人并知道他们登录失败的次数..

然后我会将此用户的数据写入我的failed_login表,如上所述。

我确定这不是您要找的答案,但它确实是跟踪您网站上用户的最佳方式。