Javascript 如何检查可疑登录?

Javascript 如何检查可疑登录?,javascript,node.js,geolocation,ip,Javascript,Node.js,Geolocation,Ip,因此,为了避免这个问题过于宽泛,我将给出在我的具体案例中使用的方法/背景,但请随意提供解决这个问题的一般方法,因为它仍然有用 目的 这可能有点过分,但谷歌等大型科技公司如果怀疑用户登录该账户可疑,就会通知用户。我也知道,如果一个网站看起来可疑,它会阻止正确的登录尝试,例如:登录到一个从未从美国境外登录过的印度帐户。对于某些网站,人们需要这种级别的监视和保护 背景 我有一个NodeJS express项目,它使用ip数据以及用户代理并将其保存到数据库中,以跟踪最新的登录我试图找到一种基于位置检测可

因此,为了避免这个问题过于宽泛,我将给出在我的具体案例中使用的方法/背景,但请随意提供解决这个问题的一般方法,因为它仍然有用

目的 这可能有点过分,但谷歌等大型科技公司如果怀疑用户登录该账户可疑,就会通知用户。我也知道,如果一个网站看起来可疑,它会阻止正确的登录尝试,例如:登录到一个从未从美国境外登录过的印度帐户。对于某些网站,人们需要这种级别的监视和保护

背景 我有一个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
方法
  • 用户代理检查-在非常弱的情况下。我可以检查并比较用户代理(
    浏览器
    操作系统
    ),看看是否使用了其他设备。但我们都知道,人们不只是使用一个设备,所以我并不认为这是有效的或有用的

  • 国家/地区检查-我发现一种更好的方法是检查国家(或地区,以获得更准确的结果)。如果有一个新的国家/地区不符合标准,那么这将是可疑的。但这可能包括假阳性,比如你住在两个国家的边界上

  • 长/纬度范围检查-最后,我认为一个更好的方法是查看用户是否相对接近他们的平均长/纬度。因为这允许居住在边境附近的人住在附近的国家,但不依赖于检查每个国家的邻国名称

  • 代码示例:

    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
    }
    
    var,长度为,单位为;
    //检查是否在纬度1度以内(两侧约69英里)
    if(loginattent.lat>(avgLat-1)和&loginattent.lat<(avgLat+1)){
    不长=真;
    }
    //检查经度是否在1度以内(通常超过50英里,两侧最多69英里)
    if(loginattent.lon>(avgLon-1)和&loginattent.lon<(avgLon+1)){
    WithInlatude=真;
    }
    如果(长度和插入长度){
    //假设正常登录,处理登录过程
    }否则{
    //可能是可疑的登录名、电子邮件用户
    }
    

    显然,IP检查并不总是可靠的,用户可能正在使用VPN,但您怎么看这足够可靠,可以工作吗?或者我应该换一种方式思考吗?

    Lat/Long会产生很大的误导。通常,一家全国性移动运营商的所有地址都与可能在数千英里之外的总部相关联。您应该对您的用户日志运行此命令,以查看实际用户的登录模式。@tadman假设avgLon和avgLat基于用户的登录模式(在本例中为移动提供商hq),则它们将始终位于此区域内。我确实考虑过基于浏览器、操作系统和地理位置进行多重比较。人们在工作、手机、家中登录是很常见的,如果不是地铁/火车/公共汽车上的WiFi,咖啡馆WiFi也是一个很好的衡量标准。这可能会创建一个相当混乱的数据模式。我敢打赌,你的用户数据中有一些极端情况,你可以用来确定实际用户的最大范围。@tadman是的,这是真的,我正在尝试寻找可靠的方法来检查用户是否在家附近(而不是不应该访问的人)。如果用户在网站上的登录模式太宽,那么我总是可以延长长/纬度,使其变为138英里,而不是69英里。首先收集数据,然后决定。你是在黑暗中拍摄的,但我敢打赌,如果你有一个用户活动日志的集合,你肯定是坐在一个数据金矿上。