Comme le titre l'indique, j'essaie de trouver un moyen d'enregistrer chaque adresse IP qui a tenté de se connecter, cela s'applique à chaque utilisateur. Utilisation de PHP et MYSQL

Laissez-moi vous expliquer en détail avec un exemple:

IP: 1.1.1.1 tente de se connecter sur l'utilisateur " Charlie123 ", indépendamment du résultat que je souhaite stocker son IP comme ceci:

Utilisateur: Charlie123 - IP 1.1.1.1

Ensuite, il y en a un autre avec IP: 2.2.2.2 qui tente de se connecter sur le même utilisateur, encore une fois indépendamment du résultat, je veux stocker son IP comme ça (rappelez-vous que nous avons déjà stocké la première IP avant) Utilisateur: Charlie123 - IP 1.1.1.1 , 2.2.2.2

Et ainsi de suite pour chaque tentative sur chaque IP. De cette façon, je peux facilement rechercher un utilisateur X et trouver chaque IP qu'il / elle a utilisée.

Ce que je sais:

Je sais comment récupérer l'adresse IP de l'utilisateur en fonction d'un POST, et je sais comment la stocker sur une base de données. Le problème est que je ne sais pas comment faire cela sans ruiner la base de données à cause de trop de colonnes / trop de caractères.

Ce que j'ai essayé (dans mon esprit):

Utilisation de la table qui contient les comptes (nom d'utilisateur et mot de passe) en ajoutant une colonne qui stockera IPS séparés par un ",". Cela échoue parce que j'atteindrai un nombre ÉNORME de caractères sur cette colonne et je ne pense pas que ce soit possible ni juste.

Créer une nouvelle table qui contiendra 1 colonne pour l'utilisateur et 1 colonne pour chaque IP. Cela échoue car il atteindra une énorme quantité de colonnes et encore une fois, je ne pense pas que ce soit la façon de faire quelque chose comme ça, imaginez vous réveiller et avoir 1000000 colonnes dans une table où la moitié d'entre elles sont vides.

Veuillez me corriger si je me trompe sur ce que j'ai écrit ici.

Pourquoi une adresse IP?

Pour être honnête, je commence par les adresses IP pour être sûr que tout fonctionne comme prévu et que mon idée n'est pas fausse. Cela peut être étendu à la journalisation de l'ordinateur qui a essayé de se connecter, du navigateur utilisé par l'utilisateur, etc. Pour l'instant, je m'en tiendrai à une seule valeur, IP.

De quel genre de réponses ai-je besoin:

N'importe quel moyen pour y parvenir, n'importe quel exemple, pseudo-code, code, tout fonctionne.

Merci d'avance.

1
Roberto Carlos 26 janv. 2019 à 16:56

3 réponses

Meilleure réponse

Créer une nouvelle table est la bonne réponse, mais "1 colonne pour chaque IP". est faux, n'enregistrez pas différentes adresses IP dans des colonnes, enregistrez-les sur différentes lignes comme ceci:

structure de la table mysql

Et recherchez-le par:

select * from login_history order by created_at desc limit 10;

résultat de la requête 1

Ou peut-être que quelqu'un change son nom d'utilisateur, vous pouvez utiliser ce sql pour vérifier son nouveau nom d'utilisateur:

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;

résultat de la requête 2

2
Bruce Xie 26 janv. 2019 à 14:42

Je fais quelque chose de similaire. J'ai créé trois colonnes, une pour la clé primaire, une autre pour le nom d'utilisateur et une pour l'adresse IP.

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

Chaque fois qu'une connexion est tentée, je remplis le nom d'utilisateur et l'adresse IP dans le tableau.

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

Donc, si je veux vérifier les tentatives de connexion en fonction du nom d'utilisateur, je lance simplement une requête avec le nom d'utilisateur et si je veux vérifier la tentative avec l'adresse IP, j'exécute une requête avec l'adresse IP.

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

Pour obtenir les résultats souhaités, c'est-à-dire des adresses IP séparées par une virgule, j'utilise simplement la fonction php pour parcourir l'ensemble de lignes et ajouter la chaîne (adresse IP)

Pour ajouter une adresse IP, quelque chose comme ça aidera en 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'];
    }

J'espère que cela t'aides.

1
Jameel 26 janv. 2019 à 14:17

Le suivi des tentatives de connexion des utilisateurs à partir d'adresses IP différentes n'entraînera pas un grand nombre d'enregistrements vides s'il est géré avec une validation appropriée avant d'insérer les enregistrements. Dans la plupart des endroits où les ingénieurs doivent suivre chaque interaction de l'utilisateur, une solution de base de données NoSQL comme mongo sera préférée à MySQL ou à un autre SGBDR.

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.
2
Susmita Mitra 26 janv. 2019 à 14:35