【发布时间】:2009-07-29 04:46:43
【问题描述】:
如何在代理服务器环境中唯一识别远程机器,我使用了 $_SERVER['REMOTE_ADDR'] 但代理网络中的所有机器都有相同的 IP 地址,有什么办法
【问题讨论】:
标签: php
如何在代理服务器环境中唯一识别远程机器,我使用了 $_SERVER['REMOTE_ADDR'] 但代理网络中的所有机器都有相同的 IP 地址,有什么办法
【问题讨论】:
标签: php
永远不要依赖来自客户的信息。在这种情况下,您会遇到简单的网络问题(您永远无法确定客户端的 IP 地址是否正确),在其他情况下,客户端可能会故意欺骗信息。
如果您需要唯一标识您的客户,请在他们第一次访问时给他们一个 cookie,这是您能做的最好的事情。
【讨论】:
你最好的选择是:
$uid = md5($_SERVER['HTTP_USER_AGENT'] . $_SERVER['REMOTE_ADDR']);
但是,无法知道他们是否更改了用户代理或其他浏览器。
【讨论】:
您可以使用其他一些标头来提供帮助,例如这些标头(查看$_SERVER 转储时想到的标头):
HTTP_USER_AGENTHTTP_ACCEPTHTTP_ACCEPT_LANGUAGEHTTP_ACCEPT_ENCODINGHTTP_ACCEPT_CHARSET使用来自客户端的多个信息将有助于区分不同的客户端(您使用的信息越多,两个客户端之间至少有一个不同的机会就越大)...
...但这不是一个完美的解决方案:-(
根据代理软件的种类及其配置,可能会有一个名为X-Forwarded-For 的标头,您可以使用:
X-Forwarded-For (XFF) HTTP 标头 是一个事实上的识别标准 客户端的原始 IP 地址 通过连接到 Web 服务器 HTTP 代理或负载平衡器。这是一个 非 RFC 标准的请求标头 由 Squid 缓存引入 代理服务器的开发者。
但我也不会依赖它:它可能不会一直存在(不认为它是必需的)
祝你好运!
【讨论】:
USER_AGENT 结合使用来识别人员。 Chrome 等浏览器会自动更新,它会一直更改字符串。一些浏览器字符串还反映了可能会更改的已安装插件。即使您只是提取浏览器名称,您也永远无法确定它没有被篡改。
我认为没有其他方法可以做你想做的事。这是因为代理服务器代理了客户的请求并代表他们行事。因此,从服务器的角度来看,客户端实际上是隐藏的。但是,我可能错了。
【讨论】:
如果您知道代理服务器,我认为这意味着这是某种公司局域网。你能控制局域网吗?也许构建和安装一些向服务器发送机器唯一 ID 的 ActiveX 插件可能是解决方案。
通常,HTTP 代理服务器不需要发送其客户端的 IP。因此,代理发送的每个请求看起来都来自代理的 IP。 (虽然 wikipedia 提到了一些自定义标头,但一些代理会发送以转发 client's ip。)
当一个 HTTP 代理本身使用另一个 HTTP 代理时,情况会变得更糟 - 获取请求的服务器只会获得链中最后一个代理的 IP,并且不能保证第二个代理甚至知道第一个代理proxy 不是普通客户!
【讨论】:
目前没有办法做到这一点,因为您没有获得有关 MAC 地址的信息,即使这样也可能是错误的,就好像有 2 个网卡,如有线网卡或无线网卡。
最好的办法是让 JavaScript 在本地写入和读取到本地存储,然后使用 Ajax 命令将保存的设置发送回您的服务器。这仍然不完美,好像他们清除了缓存,设置丢失了。
【讨论】:
JKS,
远程机器没有唯一标识符。这是不可能的。
出于安全原因,开发人员通常喜欢在最终用户访问带有登录等表单的页面时跟踪机器。
这是我的工作:我存储一个 cookie、一个会话变量并使用新的 html5 localStorage 来跟踪我敏感页面上的人。这确实是准确做到这一点的唯一方法。 localStorage 的好处(当浏览器可以这样做时),最终用户通常不知道您正在他们的机器上存储内容并且删除 cookie 没有任何效果。
因此,您可以创建一个包含跟踪详细信息的数据库表,例如: 时间戳、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 表。
我确定这不是您要寻找的答案,但它确实是在您的网站上跟踪用户的最佳方式。
【讨论】:
$_SESSION 只是 Apache 跟踪的另一个 cookie。用户只需删除包含会话 ID 的 cookie 即可重置其失败的登录尝试。相反,一个好的解决方案是为数据库中的每个用户保存最后三个失败的登录尝试的时间戳。如果这三个都发生在now() 的 5 分钟内,则禁止登录尝试。