-- MijnBesluit - onthouden welke inlogcode ECHT is gebruikt -- -- Er zit een rem op het aanvragen van codes: niet meer dan vijf per uur voor hetzelfde adres. -- Die rem is er tegen één ding: iemand die het postvak van een ander volgooit door steeds -- opnieuw een code voor dat adres aan te vragen. -- -- Die telling keek naar alle codes van het afgelopen uur, ook de codes die gewoon zijn gebruikt -- om in te loggen. Wie vijf keer in een uur inlogde, sloot zichzelf dus een uur buiten - en dat -- gebeurt precies wanneer er íéts anders aan de hand is en je het een paar keer opnieuw -- probeert. Dat is de verkeerde kant om te falen: de rem hoort een vreemde te stoppen, niet de -- eigenaar. -- -- Waarom daar een nieuwe kolom voor nodig is: `consumed_at` betekent "deze code werkt niet -- meer", en dat wordt ook gezet als een nieuwe aanvraag de vorige ongeldig maakt, en als een -- code te vaak fout is ingevuld. Precies die twee gevallen MOETEN meetellen - anders kan een -- vreemde de rem leegtrekken door codes aan te vragen of expres fout in te vullen. -- -- `signed_in_at` staat alleen gevuld als de code goed is ingevuld en er iemand mee is -- binnengekomen. Alleen dát is het bewijs dat de aanvrager zelf in dat postvak zit, en alleen -- die codes tellen niet mee voor de rem. -- -- Draaien met: -- mysql -u root -p mijnbesluit < db\14_inlogcode_gebruikt.sql -- -- Opnieuw draaien mag: er gebeurt dan niets. USE `mijnbesluit`; SET @bestaat := ( SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'login_codes' AND COLUMN_NAME = 'signed_in_at'); SET @sql := IF(@bestaat = 0, 'ALTER TABLE `login_codes` ADD COLUMN `signed_in_at` DATETIME(3) NULL', 'SELECT "signed_in_at bestaat al" AS melding'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SELECT 'Klaar.' AS melding;