Tarvitsen siis estosysteemin, jossa samalla lomakkeella voisi estää käyttäjätunnuksen, IP-osoitteen tai IP-osoitealueen (kuten 123.123.0.0/16). Kaipailen siis lähinnä ajatusmalleja, että miten tämä kannattaisi toteuttaa, ja myös siihen, miten tarkistan, kuuluuko käyttäjän IP-osoite estettyyn osoitealueeseen. Ehdotuksia?
Talleta estetyt IP-osoitteet ja käyttäjänimet johonkin (tietokanta on hyvä vaihtoehto), josta sitten haet estettyä IP:tä ja/tai käyttäjänimeä; jos löytyy niin käyttäjä/IP on estetty. Jos haluat estää kokonaisia aliverkkoja, niin talleta maski ja estetyn aliverkon osoite, IP:stä voit laskea mihin aliverkkoon se kuuluu; jos se kuuluu johonkin estetyistä aliverkoista niin IP on estetty.
Alla esimerkki aliverkon osoitteen laskemisesta PHP:llä, mutta tuo porttautuu muillekin kielille helposti:
<?php $maski = "11111111111111110000000000000000"; // 16 merkitsevää bittiä (IP-osoite on 32-bittinen). $estetty_aliverkko = "123.123.0.0"; $ip = "123.123.123.123"; // IP-osoitteen ja maskin välisellä AND-operaattorilla saadaan aliverkon osoite selville. if (ip2long($estetty_aliverkko) === (ip2long($ip) & bindec($maski))) echo "Kuulut estettyyn aliverkkoon"; else echo "Tervetuloa";
Onko järkevämpää käydä kaikki estetyt aliverkot läpi ja tarkistaa, kuuluuko IP niihin, vai käydä kaikki mahdolliset aliverkot IP-osoitteelle läpi ja tarkistaa niiden estot?
Estetyt aliverkot läpi.
Ok, ajattelin vain, että jos estettyjä aliverkkoja on vaikkapa satoja, mutta valideja aliverkkoja vain 32, niin olisi nopeampaa niin, mutta miten vaan.
Olen kyllä aivan samaa mieltä: kaikkien tutkiminen ei ole optimaalista.
Optimaalisuus riippuu estojen tallennustavasta. Järjestämättömässä listassa jouduttaisiin joka tapauksessa käymään läpi kaikki estot, jolloin luonnollisesti olisi typerää tarkistaa jokainen 32 kertaa, kun yhdelläkin selviää. Järjestetystä listasta haku kestäisi logaritmisen ajan suhteessa estojen määrään, joten tämä optimointi riittäisi jo erittäin pitkälle. Parhaimmillaan estot olisi tallennettu binaaripuuna, jolloin koko osoitteen tarkistuksessa kuluisi enintään tuo 32 askelta, mutta tässä taas estojen lataaminen muistiin kestäisi ehkä pidempään.
Järjestetty lista on siis näistä optimointitavoista realistisempi, mutta mikäli estoja on alle kymmenentuhatta, eroa triviaaliin vaihtoehtoon ei luultavasti edes huomaa.
Aihe on jo aika vanha, joten et voi enää vastata siihen.