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

时间:2015-03-03 22:19:25

标签: php mysql security account dynamic-ip

我正在尝试构建MySQL查询(或PHP脚本),以识别与其他人共享其Web登录凭据的用户。我想避免强迫用户明确注册他们的设备(比如银行),因为我想尽量减少真正用户的不便。我意识到没有办法彻底消除误报或漏报,但我想尽我所能。

在登录时,服务器将ip addressuser idbrowser fingerprintfingerprintjs2)存储到数据库中。 (指纹是一个半独特的浏览器值)。

如果每个用户只使用一个ip,这将是一个很好的选择 - 我只是SELECT所有已经从多个ips登录网站的用户。当然,情况并非如此。在现实世界中,用户可以从多个连接(例如,工作,家庭,电话)登录,并且在dynamic ips的情况下,地址本身可以改变。

大多数用户不会拥有超过5种不同的连接(有例外,但并不多)。我接受(可能)没有办法确定一个人是从5个不同的连接登录,还是5个不同的人从一个连接登录。

只要我的查询仅捕获从超过5个连接登录的用户,"每个用户的多个连接"问题不合时宜。

现在我必须面对dynamic ips用户的问题。

据我了解,提供动态关联的大多数ISPs只会更改最后一组数字(我很喜欢这方面的一些确认或统计信息)。

如果我的查询考虑了"连接"要成为ip个数字的前3组,则问题将针对ISPs只更改最后一组数字的用户。

这是我写的一个简单的MySQL查询。它按用户名对不同的ips(没有最后一组数字)进行分组,并显示与其中超过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

我打算如何处理"完全" dynamic ips(其中任何数字都可以更改)是通过统计与单个"连接共享相同browser fingerprint的所有登录"。我的理由是,如果用户使用相同的browser fingerprint从多个ips登录,那么所有这些登录都可能来自单个人,其中"完全" dynamic ip。这并不能完全解决问题,因为它无法解释使用多个浏览器的用户(因为浏览器指纹会有所不同)。

我可以使用Cookie代替browser fingerprint,但可以删除或禁用它们。

我希望对我的策略有一些意见,以及如何改进它的一些提示。如果已经有类似这样的开源实现(在PHP中) - 我想知道;没有用来重新发明轮子。

1 个答案:

答案 0 :(得分:2)

为什么不从简单开始,例如:检测用户何时同时从两个或多个IP访问网站,请求之间的阈值<30秒。那应该已经抓住了很多坏人。

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