我正在尝试构建MySQL
查询(或PHP
脚本),以识别与其他人共享其Web登录凭据的用户。我想避免强迫用户明确注册他们的设备(比如银行),因为我想尽量减少真正用户的不便。我意识到没有办法彻底消除误报或漏报,但我想尽我所能。
在登录时,服务器将ip address
,user id
和browser fingerprint
(fingerprintjs2)存储到数据库中。 (指纹是一个半独特的浏览器值)。
如果每个用户只使用一个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
中) - 我想知道;没有用来重新发明轮子。
答案 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