因此,为了避免这个问题过于宽泛,我将在我的确切案例中提供所使用的方法/背景,但随时提供解决此问题的一般方法,因为它仍然有用。
这可能有点矫枉过正,但Google等大型科技公司如果怀疑登录该帐户是可疑的,会通知他们的用户。我也知道,如果网站看起来可疑,会阻止正确的登录尝试,例如:登录到从未在美国境外登录的印度帐户。对于某些网站,人们需要这种级别的覆盖和保护。
我有一个使用iplocation的NodeJS express项目,并将ip数据和用户代理保存到数据库以跟踪最新的登录。 我试图找到一种方法来检测基于位置的可疑登录,然后在极端情况下通知用户或采取适当的措施。
以下是存储登录记录的示例:
"ip" : {
"ip" : "86.149.49.121",
"country_code" : "GB",
"country_name" : "United Kingdom",
"region_code" : "ENG",
"region_name" : "England",
"city" : "Harwich",
"zip_code" : "CO12",
"time_zone" : "Europe/London",
"latitude" : 51.95,
"longitude" : 1.3,
"metro_code" : 0
},
"ua" : {
"version" : "61.0.3163.100",
"source" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36",
"os" : "macOS Sierra",
"browser" : "Chrome"
},
"timestamp" : ISODate("2017-10-01T02:00:45.452Z"),
"__v" : 0
用户代理检查 - 非常弱的情况。我可以检查并比较用户代理(browser
,os
)以查看是否使用了其他设备。但是,众所周知,人们不会只使用一台设备,所以我不能真正看到它有效或有用。
国家/地区检查 - 我发现的更好的方法是检查国家/地区(或更准确的结果,地区)。如果新的国家/地区与标准不匹配,那么这将是可疑的。但这可能包括误报,例如,如果你住在两个国家的边界。
长/纬度范围检查 - 最后我认为更好的方法是看用户是否相对接近他们的平均长/纬度。因为这样可以让人们居住在附近的国家,如果他们住在边境附近但不依赖于检查其邻居的每个国家名称。
代码示例:
var withinLongitude, withinLatitude;
// check if within 1 degree of latitude (about 69 miles either side)
if (loginAttempt.lat > (avgLat - 1) && loginAttempt.lat < (avgLat + 1) ) {
withinLongitude = true;
}
// check if within 1 degree of longitude (usually more than 50 miles, at most 69 miles either side)
if (loginAttempt.lon > (avgLon - 1) && loginAttempt.lon < (avgLon + 1) ) {
withinLatitude = true;
}
if (withinLongitude && withinLatitude) {
// assume a normal login, handle login process
} else {
// could be a suspicious login, email user
}
显然,IP检查并不总是可靠的,用户可能正在使用VPN,但您的想法如何? 这是否足够可靠,或者我应该以不同的方式考虑这个问题吗?