我注意到一些网络服务(即 Steam、Facebook、Google 等)能够检测到新的浏览器/新位置,并且在某些情况下,需要我使用电子邮件代码对其进行验证。
他们是怎么做到的?他们使用cookie吗?还有什么办法?这有多可靠?
如何检测用户是否从他的“正常”环境登录,无论是相同的浏览器、相同的计算机、相同的大致位置?
我注意到一些网络服务(即 Steam、Facebook、Google 等)能够检测到新的浏览器/新位置,并且在某些情况下,需要我使用电子邮件代码对其进行验证。
他们是怎么做到的?他们使用cookie吗?还有什么办法?这有多可靠?
如何检测用户是否从他的“正常”环境登录,无论是相同的浏览器、相同的计算机、相同的大致位置?
以下是您可能感兴趣的一些想法...
正如我已经对你说过的,这不是一门精确的科学。您应该首先保留对安全最重要的内容,并考虑所有这些“可选”
另外,请记住,所有建议的“持续时间”都是主观的,具体取决于对您网站的访问有多狂热以及设备检测的强度。
这些是可能有助于识别设备的因素:
首先,access token cookie
可能不一定不同device id cookie
,事实上,访问令牌可以用于唯一标识浏览器,即使令牌字符串经常以这种方式更新:1 个会话 = 1 个设备。
相反,如果您想在同一设备上考虑两个或多个浏览器,您当然应该使用两个不同的 cookie。1 个设备 = 1 个 chrome 会话 + 1 个 Firefox 会话等。
其次,cookie 应该“永不”过期(将其设置为很多年过期)。如果您想使“记住我”的持续时间过期,您应该只在您的代码中执行此操作。 这是因为“永不”过期的 cookie 并且实际上与过期会话相关联,因此它对于识别用户正在使用的设备仍然很有用! 此外,当用户注销时,不要在您的代码中删除 cookie,在内部销毁会话。
每次用户将 IP 更改为您认为有效的 IP 时,您都应该记录它。这意味着您需要一个用于记录所有 IP 的表sessionID | IP | lastActionDateTime | [other factors]+
。如果包含 deviceID 和 IP 组合的行已经存在,并且lastActionDateTime
例如在 12-24 小时内完成,您将更新lastActionDT
,否则您应该创建一个新行。除非其他因素发生变化。
使用 GEOIP 数据库,您可以获得用户的位置:这甚至不可靠,但您可以使用 Google Maps API 检查最后一个已知位置与与 IP 关联的新位置之间的距离,或者 GEOIP 数据库是否已经给出你 LAT,LONG 值你可以简单地计算两点之间的距离(更多信息在这里,但网上有很多文章......我实际上并没有检查它,但它应该没问题)。因此,假设您可能认为距最后一个已知位置 100-500 公里的 IP 有效。
使用 3G IP 可能会改变,即使走一些步骤,所以如果您收到具有不同 IP 的页面视图,并且最近的一些页面视图是使用相同 IP 进行的,您必须认为该 IP 有效,因为它只是一些有效的( ) 之前的分钟lastActionDT
,当然根据其他因素的状态,这应该与最后一个已知的因素相同。
如果您在几个小时或可能几天不活动后检测到更改的 IP,您可能希望将其视为有效并允许登录,尤其是在其他因素匹配时,或者如果您想要更强的安全性,您可以将这种情况视为如下:
如果您在很多天不活动后检测到更改的 IP,您应该请求使用表单再次登录。此处会话已过期,但 cookie 仍然存在且可用,因此如果表单凭据有效,您将更新deviceID
过期时间而不是创建新的deviceID
.
UA 字符串提供了一些额外的检查,但在大多数情况下不一定相关,但对于检测可疑的版本控制更改很有用(例如,如果同一会话首先生成 Chrome 27.0 页面浏览量,然后一段时间后生成 Chrome 26.0 页面浏览量,您会怎么想? )。
因此,这是非常不可靠的,但正如您可以想象的那样,它提供了一些提示。
如果您想将同一台计算机上的两个浏览器视为同一个“设备”,您可以使用 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
)
可以使用 HTML5 Geolocation API 进行另一个额外的检查(当然也有,因为它是客户端的安全性不可信,但如果与前面的因素一起使用它会很有帮助) Geolocation API Spec
希望对您有所帮助...
韦斯
免责声明:我与 Steam 没有任何关系
他们使用cookie吗?
可能,您可以使用网络嗅探器找到它。请参见:
和其他相关材料。
还有什么办法?
可能,您需要通过分析流量来找出可能需要您进行中间人攻击的流量。这可能很难完成,因此您也可以尝试联系 Steam 的技术支持并索取技术文档。这两个动作都将帮助您了解更多信息。
这有多可靠?
可靠性通常取决于需求,所以我会说它足够可靠,可以满足 Steam 的需求。