MySQL/PHP:识别共享其登录凭据的站点用户

MySQL/PHP:识别共享其登录凭据的站点用户,php,mysql,security,account,dynamic-ip,Php,Mysql,Security,Account,Dynamic Ip,我正在尝试构造一个MySQL查询(或PHP脚本),以识别与其他人共享其web登录凭据的用户。我希望避免强迫用户明确注册他们的设备(就像银行那样),因为我希望最大限度地减少对真正用户的不便。我意识到没有办法完全消除假阳性或假阴性,但我想尽我所能做到最好 登录时,服务器将ip地址、用户id和浏览器指纹()存储到数据库中。(指纹是一个半唯一的浏览器值) 如果每个用户只使用一个ip,那就太容易了-我只要选择所有从多个ip登录到网站的用户。当然,情况并非如此。在现实世界中,用户可以通过多个连接(例如工作、

我正在尝试构造一个
MySQL
查询(或
PHP
脚本),以识别与其他人共享其web登录凭据的用户。我希望避免强迫用户明确注册他们的设备(就像银行那样),因为我希望最大限度地减少对真正用户的不便。我意识到没有办法完全消除假阳性或假阴性,但我想尽我所能做到最好

登录时,服务器将
ip地址
用户id
浏览器指纹
()存储到数据库中。(指纹是一个半唯一的浏览器值)

如果每个用户只使用一个
ip
,那就太容易了-我只要选择
所有从多个ip登录到网站的用户。当然,情况并非如此。在现实世界中,用户可以通过多个连接(例如工作、家庭、电话)登录,在
动态IP的情况下,地址本身可以更改

大多数用户不会有超过5个不同的连接(有例外,但不多)。我承认(可能)没有办法确定一个人是否从5个不同的连接登录,或者是否有5个不同的人分别从一个连接登录

只要我的查询只捕获从5个以上连接登录的用户,那么“每个用户多个连接”问题就不存在了

现在我必须面对
动态IP的用户问题

据我所知,大多数提供动态连接的
isp
只会更改最后一组数字(我希望得到一些关于这方面的确认或统计数据)

如果我的查询认为“连接”是前3组
ip
数字,那么问题将针对仅更改最后一组数字的
isp
用户解决

下面是我编写的一个简单的
MySQL
查询。它按用户名对不同的
IP
(不含最后一组数字)进行分组,并显示与其中5个以上相关联的用户名:

SELECT
    GROUP_CONCAT(DISTINCT ip SEPARATOR '/') AS ips,
    username,
    COUNT(DISTINCT ip) AS n_ips
FROM
    (
        SELECT DISTINCT user_id, SUBSTRING_INDEX(ip_address,'.',3) AS ip
        FROM
            ip_logins
        WHERE
            login_date > DATE_SUB(NOW(), INTERVAL 7 DAY )
    ) AS weekips
JOIN users AS u ON (
    u.id = weekips.user_id
)
GROUP BY
    username
HAVING
    COUNT(n_ips) > 5
ORDER BY
    n_ips DESC
我打算“完全”处理动态IP(其中任何数字都可以更改)的方法是将共享同一
浏览器指纹的所有登录计数为一个“连接”。我的推理是,如果一个用户使用相同的
浏览器指纹从多个ip登录,那么所有这些登录都可能来自一个具有“完全”动态ip的个人。这并不能完全解决问题,因为它无法考虑使用多个浏览器的用户(因为浏览器指纹会有所不同)

我可以使用cookie而不是
浏览器指纹
,但这些可以被删除或禁用


我希望能对我的战略提出一些建议,并就如何改进提出一些建议。如果已经有类似的开源实现(在
PHP
中),我想知道;重新发明轮子没有用。

为什么不简单地开始,比如:检测用户何时同时从两个或多个IP访问站点,阈值为何不在他们的记录上设置一个标志并检查该标志?“您已经登录到另一台计算机上。”您可以对该标志设置时间限制,这样,如果用户诚实地尝试从另一台计算机登录,则在该标志的时间过期后,他们将被允许登录。因为用户可以从多个设备登录,这对我们来说是正常的。我们有许多用户喜欢在多个设备上持续登录,我不想给他们带来不便。此外,我们希望能够在采取行动之前手动查看用户列表。我们打算向他们解释共享帐户违反我们的TOS,并强迫他们更改密码。请看我对Jay Blanchard评论的回答-相同的回答。30秒对我们来说也不行。我们有大约4k用户,他们每月支付20美元。“共享者”和“共享者”不太可能在30秒内登录。(还是我误解了你的答案?)啊,从查询中我看到你在存储用户登录的时间。我认为,如果您按登录用户记录所有页面加载,它应该会显示真正的同步用户。但这取决于你提供的内容类型。您是否看到登录的唯一IP地址增加了10倍?它是一个需要同时从多个设备使用的站点吗?我不确定我是否了解记录所有页面加载的实用程序。。也许我没抓住重点。为了回答您的问题,是的,对于一些用户,我确实看到登录时有十倍的独特IP地址。这是一个天气网站,因此人们不太可能同时从多个设备上使用它,但即使有人共享他们的帐户,人们也不太可能同时使用它。我的意思是,登录用户记录所有活动并搜索数据集可能会更容易(参见上面编辑中的示例)在给定的时间范围内从多个IP进行活动的帐户。如果只记录登录时间戳,则不同的IP可能是同一个人。如果如您所说,从多个设备(因此IP)使用同一帐户的可能性很小在短时间内,那么短时间内的成功肯定是一个共享帐户。啊,我明白了。这很聪明。我会考虑这样做。如果我最终使用它,我会接受你的答案:)
id  account_id  ip_address  time      page
1   1           1.1.1.1     00:00:00  /weather/amsterdam/today   <-- multiple IPs
2   1           2.2.2.2     00:00:05  /weather/london/yesterday  <-- on the same 
3   1           3.3.3.3     00:00:06  /weather/brussels/today    <-- account
4   1           4.4.4.4     02:02:02  /weather/paris/tomorrow