他们是通过什么方式实现的呢?使用cookie还是其他方法?这种方法可靠吗?
我该如何检测用户是否在他的“正常”环境中登录,例如同一浏览器、同一台电脑、大致相同的位置?
他们是通过什么方式实现的呢?使用cookie还是其他方法?这种方法可靠吗?
我该如何检测用户是否在他的“正常”环境中登录,例如同一浏览器、同一台电脑、大致相同的位置?
这里有一些你可能感兴趣的想法...
正如我之前告诉过你的,这不是一门精确的科学。你应该首先考虑安全方面的重要性,并将所有这些“可选项”纳入考虑。
此外,请记住,所有建议的“时间持续”都是主观的,取决于访问您网站的频率以及设备检测的强度。
以下是用于识别设备的因素:
首先,访问令牌cookie
可能与设备ID cookie
并不完全不同。实际上,即使令牌字符串经常更新this way,访问令牌可以用来唯一标识浏览器:1个会话=1个设备。
如果您想要将同一设备视为两个或多个浏览器,则应当使用两个不同的cookie。例如:1个设备= Chrome上的1个会话+ Firefox上的1个会话等。
其次,cookie(s)应该“永不”过期(设置为数年内过期)。 如果您想要在“记住我”时间段后让cookie(s)过期,您只应该在代码中进行设置。 这是因为一个“永不”过期的cookie,即使已经关联到了过期的会话,仍然有用于识别用户使用的设备! 当用户登出时,不要删除cookie(s),而应该在代码中销毁会话。
sessionID | IP | lastActionDateTime | [other factors]+
。如果包含设备ID和IP地址的行已经存在,并且如果lastActionDateTime
是在12-24小时内进行的,那么您将更新lastActionDT
,否则您应该创建一个新行。除非其他因素发生了变化。
使用GEOIP数据库可以获取用户的位置: 但它并不可靠,然而您可以使用Google Maps API来检查最后已知位置与与IP相关联的新位置之间的距离,或者如果GEOIP数据库已经给出LAT,LONG值,您可以简单地计算两点之间的距离(更多信息在这里,但网络上有很多文章...我没有实际检查过,但应该没问题)。因此,假设您可能认为一个IP与上次已知位置相距100-500公里是有效的。
使用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 地理位置 API 进行另一个附加检查(当然,由于它是客户端的,所以对于安全性来说不可信,但如果与前面的因素合作使用,则非常有帮助) Geolocation API Spec
希望能够有所帮助...
Wes