一些网络服务如何识别我从新位置登录?

32
我注意到一些网络服务(比如Steam、Facebook和Google等)能够检测到新的浏览器或者新的位置,有时需要我通过邮件验证码来验证。

他们是通过什么方式实现的呢?使用cookie还是其他方法?这种方法可靠吗?

我该如何检测用户是否在他的“正常”环境中登录,例如同一浏览器、同一台电脑、大致相同的位置?


很可能他们使用计算机的IP地址。但是一旦连接,客户端可以发送无数数据到服务器,这些数据可以帮助他们确定你正在运行哪台机器。 - STLDev
他们可能使用多种技术。其中最大的部分是IP识别/位置,但是他们还可以添加设备识别、浏览器识别等等。 - bobek
这怎么不是建设性的呢?我在问一个真实的问题,在一个真实的场景中,它有一个真正的解决方案。这根本不是一个辩论性的问题。 - Madara's Ghost
让我们以“Steam”为例。请联系他们的技术部门,询问他们是如何做到的,除非Steam开发团队中的某个人发现了你的问题,否则对于其他人来说,这是一个猜测的邀请。相反,我建议您展示一下您已经研究过的内容。 - hakre
2个回答

33

这里有一些你可能感兴趣的想法...

正如我之前告诉过你的,这不是一门精确的科学。你应该首先考虑安全方面的重要性,并将所有这些“可选项”纳入考虑。

此外,请记住,所有建议的“时间持续”都是主观的,取决于访问您网站的频率以及设备检测的强度。


以下是用于识别设备的因素:

访问Cookie(s)

首先,访问令牌cookie可能与设备ID cookie并不完全不同。实际上,即使令牌字符串经常更新this way,访问令牌可以用来唯一标识浏览器:1个会话=1个设备。

如果您想要将同一设备视为两个或多个浏览器,则应当使用两个不同的cookie。例如:1个设备= Chrome上的1个会话+ Firefox上的1个会话等。

其次,cookie(s)应该“永不”过期(设置为数年内过期)。 如果您想要在“记住我”时间段后让cookie(s)过期,您只应该在代码中进行设置。 这是因为一个“永不”过期的cookie,即使已经关联到了过期的会话,仍然有用于识别用户使用的设备! 当用户登出时,不要删除cookie(s),而应该在代码中销毁会话。

IP地址

如何记录IP地址?

每当用户更改IP地址为您认为有效的IP地址时,您应该记录下来。这意味着您需要一个用于记录所有IP地址的表格sessionID | IP | lastActionDateTime | [other factors]+。如果包含设备ID和IP地址的行已经存在,并且如果lastActionDateTime是在12-24小时内进行的,那么您将更新lastActionDT,否则您应该创建一个新行。除非其他因素发生了变化。

如何检查更改后的IP地址是否有效?

使用GEOIP数据库可以获取用户的位置: 但它并不可靠,然而您可以使用Google Maps API来检查最后已知位置与与IP相关联的新位置之间的距离,或者如果GEOIP数据库已经给出LAT,LONG值,您可以简单地计算两点之间的距离(更多信息在这里,但网络上有很多文章...我没有实际检查过,但应该没问题)。因此,假设您可能认为一个IP与上次已知位置相距100-500公里是有效的。

当IP发生变化时怎么办?

  • 使用3G网络时,IP地址可能会在行走几步后发生变化。因此,如果您收到一个带有不同IP的页面访问,并且某个最近的先前页面访问是使用相同的IP进行的,则必须考虑该IP地址有效,因为它在几分钟前(lastActionDT)是有效的,当然还要根据其他因素的状态来确定,这些因素应与上次已知的因素相同。

  • 如果您在数小时或可能数天的不活动后检测到更改的IP地址,则可以将其视为有效并允许登录,特别是如果其他因素匹配,或者如果您想要更强的安全性,则可以将此情况视为以下情况:

  • 如果您在很多天的不活动后检测到更改的IP地址,则应要求使用表单重新登录。在这里,会话已过期,但Cookie仍然存在且可用,因此,如果表单凭据有效,则将更新deviceID的过期时间而不是创建新的deviceID

UA字符串

UA字符串提供了一些额外的检查,但并不是大多数情况下相关的,但对于检测可疑的版本更改非常有用(例如,如果同一个会话先生成Chrome 27.0页面视图,然后一段时间后生成Chrome 26.0页面视图,你会怎么想?)。

  • 用户可能使用了用户代理切换器。
  • 用户在同一台机器上的另一个浏览器中导入了偏好设置(包括cookie)。
  • 会话cookie被盗。

因此,这是非常不可靠的,但正如你所想象的那样,它提供了一些提示。

(奖励)屏幕属性

如果您想将同一台计算机上的两个浏览器视为同一“设备”,则可以使用JavaScript(当然,由于它是客户端检查,因此对于安全性来说不可信,但仍然有帮助...例如,如果有人窃取了会话cookie,则可能不知道他需要伪造您将用于附加检查的这些值:-P)。无论如何,window.screen包含这些属性,这些属性对于唯一标识操作系统/计算机非常有用。

  • window.screen.availWidth & window.screen.availHeight
  • window.screen.availLeft & window.screen.availTop
  • window.screen.width & window.screen.height

需要注意的是,在移动设备上,这些值可能会在运行时被反转(请检查window.screen.orientation

(额外奖励)地理位置 API

可以使用 HTML5 地理位置 API 进行另一个附加检查(当然,由于它是客户端的,所以对于安全性来说不可信,但如果与前面的因素合作使用,则非常有帮助) Geolocation API Spec

希望能够有所帮助...

Wes


1
@hakre:嗯,这个问题只是以Steam为例,但确实回答了我的问题。感谢你的回答Wes! - Madara's Ghost

0
免责声明:我与Steam没有任何关系。
他们使用cookie吗?
可能可以通过网络嗅探器找到答案。请参见:
- 如何捕获从我的路由器到特定服务器的数据包? 以及其他相关材料。
还有其他方法吗?
可能需要通过分析流量来找到答案,这可能需要进行中间人攻击。这可能很难实现,因此您也可以尝试联系Steam的技术支持并请求技术文档。这两种方法都将帮助您了解更多信息。
那可靠性如何?
可靠性通常取决于需求,因此我认为对于Steam的需求来说足够可靠。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接