bruteforce-protect query
hier. alleen daar zat nog een foutje in de brute-force protectie, al een keer of vijf gebumpt maar nog geen reactie, en ik kom er niet uit.
het login script is zodanig gebouwd dat er bij het inloggen gekeken wordt of de gebruiker de laatste vijf minuten al 3 keer foutief heeft geprobeerd in te loggen. dan een blokkade van 5 minuten, na die vijf minuten moet het dan weer opnieuw beginnen. bij elke foutieve inlogpoging wordt er een rij toegevoegd aan de volgende tabel:
tabel loginfail
- username (gebruikersnaam geprobeerd om in te loggen)
- IP (op welk ip)
- dateAndTime (huidige datum en tijd)
en wat er mis gaat, en volgens mij aan volgende query ligt:
na drie keer foutief inloggen blokkeert dit script het keurig. ook na vijf minuten weer opnieuw in kunnen loggen, prima. maar dan weer een fout wachtwoord (al is dat een dag later) kun je maar 1 keer foutief inloggen, en dan wordt je geblokkeerd. dit zou dus 3 keer moeten zijn.
wanneer ik dit dan in phpmyadmin draai, krijg ik altijd alle records.
ik heb een tijdje geleden een topic gestart over een login-script, zie het login script is zodanig gebouwd dat er bij het inloggen gekeken wordt of de gebruiker de laatste vijf minuten al 3 keer foutief heeft geprobeerd in te loggen. dan een blokkade van 5 minuten, na die vijf minuten moet het dan weer opnieuw beginnen. bij elke foutieve inlogpoging wordt er een rij toegevoegd aan de volgende tabel:
tabel loginfail
- username (gebruikersnaam geprobeerd om in te loggen)
- IP (op welk ip)
- dateAndTime (huidige datum en tijd)
en wat er mis gaat, en volgens mij aan volgende query ligt:
na drie keer foutief inloggen blokkeert dit script het keurig. ook na vijf minuten weer opnieuw in kunnen loggen, prima. maar dan weer een fout wachtwoord (al is dat een dag later) kun je maar 1 keer foutief inloggen, en dan wordt je geblokkeerd. dit zou dus 3 keer moeten zijn.
wanneer ik dit dan in phpmyadmin draai, krijg ik altijd alle records.
Na die 5 minuten voer je een query uit om te kijken of het toegestaan is, als dat wel het geval is kun je het resultaat toch gewoon weer verwijderen?
ik wil kunnen zien welke ip's er allemaal hebben geprobeerd om verkeerd in te loggen, om een brute-force aanval te kunnen herkennen. ik wil dan een script bouwen die bij een x aantal inlogpogingen gewoon het ip blokkeert
is er toevallig een genie online, die dit eens wil bekijken?
Kan je geen cookie gebruiken? Lijkt mij stukken makkelijker...
beveiligingrisico. die kan de gebruiker zo verwijderen. en sessions gaan ook verloren
kun je niet een query laten uitvoeren die controleert hoeveel verschillende ip adressen er proberen in te loggen op 1 gebruikersnaam binnen 24 uur
check bovenstaande query... alleen die checkt op laatste vijf minuten, omdat ik meer niet nodig heb
als deze niet gelijk zijn dan zou het kunnen zijn dat er een bot bezig is.
maar ik wil een brute-force tegengaan door te bekijken of dat IP de laatste vijf minuten driemaal heeft geprobeerd in te loggen zonder succes, dan wil ik dat username + IP blokkeren voor 5 minuten. de loginAttempt (in de query) moet dus lager zijn dan 3 om uberhaupt in te kunnen loggen (hier zorgt php voor). maar die query geeft dus lekker de hele database terug
en dat je hier iedere keer dat een inlog wel lukt het ip adres bij schrijft dat zie je dit. als de gebruiker dan 3x verkeerd inlogt maar dan met het ip van hem zelf dan kun je hem bijvoorbeeld een andere blokkerings tijd meegeven.
zou kunnen. maar dan moet die query dus wel werken, en dat doet ie niet
rijen: id, datum van wanneer er verkeerd is gedaan, ip
Telkens als er een fout wachtwoord is, moet je een nieuw record aanmaken.
id wordt automatisch gedaan, de tabel 'pogingen' moet je ook na 30 minuten bijvoorbeeld resetten. Niet alles, alleen deze waarvoor de datum:
>= NOW() + 30 minuten
Je kan nog een tabel aanmaken: BAN
Als er 5 records zijn van hetzelfde ip, dan wordt het ip gepost bij bans.
Daar kan je dan ook een ban_verloop rij maken, ban_reden enzovoort.
Je controleert dan ook op de loginpagina of de ip in de database bevindt.
lijkt me vrij omslachtig, en wat als er over dat halfuur wordt geprobeerd te bruteforcen? dat er elke keer niet meer dan 4 ip voorkomen?
Anders kunnen ze niet meer inloggen?
Met cookies of sessie's ga je niet kunnen werken.
Gewijzigd op 10/04/2012 17:51:18 door - Diov -
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
SELECT username, ipaddress
FROM loginFail
WHERE
DateAndTime >= DATE_ADD(NOW() INTERVAL -5 MINUTE)
AND
username = :username
GROUP BY username, ipaddress
HAVING (COUNT(username) = 3)
FROM loginFail
WHERE
DateAndTime >= DATE_ADD(NOW() INTERVAL -5 MINUTE)
AND
username = :username
GROUP BY username, ipaddress
HAVING (COUNT(username) = 3)
Eventjes uit mijn hoofd maar in die richting moet je het zoeken.
@ger, wat doet DATE_ADD()?
dit lijkt voorlopig te werken. moet even testen of ie altijd werkt, maar tot nu toe bedankt!
Als je het goed uitschrijft ben je er ook:
NOW() - INTERVAL 5 MINUTE
vind ik ook netter! bedankt voor het melden noppes ^^