如何记录每个用户尝试登录的IP地址?

时间:2019-01-26 13:56:04

标签: php mysql

正如标题所述,我正在尝试找到一种方法来记录每个尝试登录的IP地址,这适用于每个用户。使用PHP和MYSQL

让我用一个例子来详细解释:

IP: 1.1.1.1 尝试登录用户“ Charlie123 ”,而与要存储其IP的结果无关,如下所示:

用户: Charlie123 -IP 1.1.1.1

然后还有一个具有IP的IP: 2.2.2.2 ,它尝试登录同一用户,再次与结果无关,我想这样存储它的IP(记住我们已经存储了之前的第一个IP) 用户: Charlie123 -IP 1.1.1.1 2.2.2.2

对于每个IP的每次尝试,依此类推。 这样,我可以轻松地搜索X用户并找到他/她使用的每个IP。

我所知道的:

我知道如何根据POST检索用户的IP,并且知道如何将其存储在数据库中。问题在于,由于列/字符过多,我不知道如何做到不破坏数据库。

(在我的脑海中)我尝试过的事情:

使用包含帐户(用户名和密码)的表,添加一列,该列将存储以“,”分隔的IPS。之所以失败,是因为我将在该列上看到大量的字符,而且我认为这不可能也不正确。

创建一个新表,该表将为User包含1列,每个IP包含1列。之所以失败,是因为它将达到巨大的列数,我不认为这是这样做的方法,想象一下醒来并在一个表中有1000000列,其中一半为空。

如果我在这里写的内容有误,请纠正我。

为什么要输入IP地址?

说实话,我从IP开始,以确保一切正常,并且我的想法没有错。这可以扩展为记录尝试登录的计算机,用户使用的浏览器等。 现在,我将只保留1个值,即IP。

我需要什么样的答案:

任何实现此目的的方法,任何示例,伪代码,代码,任何有效的方法。

谢谢。

3 个答案:

答案 0 :(得分:2)

跟踪来自不同IP地址的用户登录尝试     如果使用以下命令进行管理,将不会导致大量的空白记录     在插入记录之前进行适当的验证。在大多数地方     工程师需要跟踪每个用户的NoSQL数据库交互     像mongo这样的解决方案将比MySQL或其他RDBMS更受青睐。

However, If you use RDBMS approach:

1. Create a recent login_attempts table with username, ip_address, timestamp
2. Add check constraints on ip_address so that only valid IP addresses can be added.
3. Create a unique key of username and ip_address if duplicate records are found replace the current entry an insert the old record
    into an archives tables with the old username, IP, timestamp.
4. Write a shell script to get periodically rid of stale data and keep the recent login attempts table clean.

答案 1 :(得分:2)

创建一个新表是正确的答案,但是“每个IP 1列”。是错误的,不要将不同的ip保存到列中,而是将它们保存到不同的行中:

mysql table structure

并通过以下方式进行搜索:

select * from login_history order by created_at desc limit 10;

query result 1

或者可能有人在其中更改用户名,您可以使用此sql检查其新用户名:

select u.username, lh.ipv4, lh.created_at from `user` u left join `login_history` lh ON u.id=lh.uid order by created_at desc limit 10;

query result 2

答案 2 :(得分:1)

我正在做类似的事情。我创建了三列,一列用于主键,另一列用于用户名,一列用于IP地址。

    create table sample (sno int(9) auto_increment, username varchar(80), ipaddress varchar(15), primary key(sno))

每次尝试登录时,请在表中填写用户名和IP地址。

    insert into sample (username, ipaddress) values ('abc', '1.1.1.1');

因此,如果我想根据用户名检查登录尝试,我只用用户名运行查询,如果我想用IP地址检查登录尝试,我就用IP地址运行查询。

    select * from sample where username = 'abc'
    select * from sample where ipaddress = '1.1.1.1'

要获得理想的结果,即用逗号分隔的IP地址,我只是使用php函数遍历行集并附加字符串(ip地址)

要附加ipaddress,类似这样的方法将对php有所帮助

    $res // initial variable that holds username string 
    $query = //mysql query result
    while($r = mysqli_fetch_assoc($query))
    {
    $res = $res.' comma or space etc '.$r['ipaddress'];
    }

希望这会有所帮助。