|
| Anti-Hacker Denial of Service i php Fra : Tom Brøndsted |
Dato : 31-01-06 23:29 |
|
På mit site ligger der en del meget gamle tekster med afvigende
stavemåde. F.eks. er der en maler der i 1790 "brøster" sig af
forskellige ting. Med det resultat, at folk (der ikke kan stave)
undertiden bliver lokket til ved at søge på "store brøster"!
I denne hysteriske tid er der også ganske mange fra eksotiske lande der
lokkes til ved at søge på "Jylland" og "Posten" samt en afvigende
stavemåde af en hvis herre, der har været afbilledet i en større dansk
avis. Noget mere ubehageligt!
Jeg har lavet et program (i c) der autogenerer en php funktion ud fra en
ip-to-country.csv. Funktionen returnerer en tom side (exit'er), hvis den
besøgendes IP er fra et område, jeg ikke ønsker besøg fra. Funktionen er
en masse "if - else" sætninger, ialt ca. 100 kb. Dette er af mange
grunde ikke optimalt. Hvad kan man ellers gøre?
mvh tb
PS jeg vil være taknemmelig hvis vi kan holde os til det tekniske.
| |
Michael Zedeler (01-02-2006)
| Kommentar Fra : Michael Zedeler |
Dato : 01-02-06 00:01 |
|
Tom Brøndsted wrote:
> Jeg har lavet et program (i c) der autogenerer en php funktion ud fra en
> ip-to-country.csv. Funktionen returnerer en tom side (exit'er), hvis den
> besøgendes IP er fra et område, jeg ikke ønsker besøg fra. Funktionen er
> en masse "if - else" sætninger, ialt ca. 100 kb. Dette er af mange
> grunde ikke optimalt. Hvad kan man ellers gøre?
Det mest optimale er, at overlade arbejdet til Apache, så PHP slet ikke
bliver aktiveret. Put det hele i en .htaccess-fil eller andetsteds i
konfigurationen.
Hvis det ikke kan lade sig gøre, så stop din liste af ip-numre i en
indeks-fil, som er hurtig at slå op i. Hvis du har adgang til Berkeley
DB, er det vejen frem (bemærkning 1: se
http://dk.php.net/manual/en/ref.dba.php) (bemærkning 2: du kan få Apache
til at bruge lignende filer i mod_rewrite).
Det er ofte hurtigere at bruge denne løsning frem for relationelle
databaser, da dette reelt bare en en (lille) fil, som er meget effektivt
indekseret.
Mvh. Michael.
--
Which is more dangerous? TV guided missiles or TV guided families?
Visit my home page at http://michael.zedeler.dk/
Get my vcard at http://michael.zedeler.dk/vcard.vcf
| |
Tom Brøndsted (01-02-2006)
| Kommentar Fra : Tom Brøndsted |
Dato : 01-02-06 00:51 |
|
Michael Zedeler wrote:
> Tom Brøndsted wrote:
>
>> Jeg har lavet et program (i c) der autogenerer en php funktion ud fra
>> en ip-to-country.csv. Funktionen returnerer en tom side (exit'er),
>> hvis den besøgendes IP er fra et område, jeg ikke ønsker besøg fra.
>> Funktionen er en masse "if - else" sætninger, ialt ca. 100 kb. Dette
>> er af mange grunde ikke optimalt. Hvad kan man ellers gøre?
>
>
> Det mest optimale er, at overlade arbejdet til Apache, så PHP slet ikke
> bliver aktiveret. Put det hele i en .htaccess-fil eller andetsteds i
> konfigurationen.
>
> Hvis det ikke kan lade sig gøre, så stop din liste af ip-numre i en
> indeks-fil, som er hurtig at slå op i. Hvis du har adgang til Berkeley
> DB, er det vejen frem (bemærkning 1: se
> http://dk.php.net/manual/en/ref.dba.php) (bemærkning 2: du kan få Apache
> til at bruge lignende filer i mod_rewrite).
>
> Det er ofte hurtigere at bruge denne løsning frem for relationelle
> databaser, da dette reelt bare en en (lille) fil, som er meget effektivt
> indekseret.
>
> Mvh. Michael.
Tak for dit svar Michael.
Måske ved jeg for lidt om .htaccess-syntaksen. Som du sikkert ved er de
forskellige områders ip-adresser defineret i "ranges", f.eks. er Island
i områderne fra-til
"1049722880","1049731071","IS","ISL","ICELAND"
OG
"1358434304","1358438399","IS","ISL","ICELAND"
OG
"1359937536","1359970303","IS","ISL","ICELAND"
osv.
Hvordan kan det klares i .htaccess?
mvh tb
| |
Michael Zedeler (01-02-2006)
| Kommentar Fra : Michael Zedeler |
Dato : 01-02-06 09:18 |
|
Tom Brøndsted wrote:
> Michael Zedeler wrote:
>
>> Tom Brøndsted wrote:
>>
>>> Jeg har lavet et program (i c) der autogenerer en php funktion ud fra
>>> en ip-to-country.csv. Funktionen returnerer en tom side (exit'er),
>>> hvis den besøgendes IP er fra et område, jeg ikke ønsker besøg fra.
>>> Funktionen er en masse "if - else" sætninger, ialt ca. 100 kb. Dette
>>> er af mange grunde ikke optimalt. Hvad kan man ellers gøre?
>>
>> Det mest optimale er, at overlade arbejdet til Apache, så PHP slet
>> ikke bliver aktiveret. Put det hele i en .htaccess-fil eller
>> andetsteds i konfigurationen.
>
> Måske ved jeg for lidt om .htaccess-syntaksen. Som du sikkert ved er de
> forskellige områders ip-adresser defineret i "ranges", f.eks. er Island
> i områderne fra-til
> "1049722880","1049731071","IS","ISL","ICELAND"
> OG
> "1358434304","1358438399","IS","ISL","ICELAND"
> OG
> "1359937536","1359970303","IS","ISL","ICELAND"
> osv.
>
> Hvordan kan det klares i .htaccess?
Du er nødt til at konvertere den ovenstående fil til blok-syntaks eller
noget lignende for at få noget som Apache kan håndtere. Du kan se hvad
mulighederne i Apache er i manualen:
http://httpd.apache.org/docs/2.0/mod/mod_access.html
eller (mere kompliceret)
http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html
Omregning til dot-syntaks (som Apache bruger) står der noget om her:
http://ip-to-country.webhosting.info/node/view/55
Mvh. Michael.
--
Which is more dangerous? TV guided missiles or TV guided families?
Visit my home page at http://michael.zedeler.dk/
Get my vcard at http://michael.zedeler.dk/vcard.vcf
| |
Johan Holst Nielsen (01-02-2006)
| Kommentar Fra : Johan Holst Nielsen |
Dato : 01-02-06 12:09 |
|
Tom Brøndsted wrote:
> Jeg har lavet et program (i c) der autogenerer en php funktion ud fra en
> ip-to-country.csv. Funktionen returnerer en tom side (exit'er), hvis den
> besøgendes IP er fra et område, jeg ikke ønsker besøg fra. Funktionen er
> en masse "if - else" sætninger, ialt ca. 100 kb. Dette er af mange
> grunde ikke optimalt. Hvad kan man ellers gøre?
Forstår ikke helt hvorfor der er SÅ mange if - elseif'er?
Hvis det udelukkende er ip-to-country ville det (imho) være nemmere at
smide det i en database - og køre en enkelt forespørgsel og tjekke landet?
mvh
Johan
| |
Tom Brøndsted (01-02-2006)
| Kommentar Fra : Tom Brøndsted |
Dato : 01-02-06 12:55 |
|
Johan Holst Nielsen wrote:
> Tom Brøndsted wrote:
>
>> Jeg har lavet et program (i c) der autogenerer en php funktion ud fra
>> en ip-to-country.csv. Funktionen returnerer en tom side (exit'er),
>> hvis den besøgendes IP er fra et område, jeg ikke ønsker besøg fra.
>> Funktionen er en masse "if - else" sætninger, ialt ca. 100 kb. Dette
>> er af mange grunde ikke optimalt. Hvad kan man ellers gøre?
>
>
> Forstår ikke helt hvorfor der er SÅ mange if - elseif'er?
>
> Hvis det udelukkende er ip-to-country ville det (imho) være nemmere at
> smide det i en database - og køre en enkelt forespørgsel og tjekke landet?
>
> mvh
> Johan
Hvis der er et Denial of Service angreb, drejer det sig jo om 1) at
skabe så lidt trafik som muligt (derfor returnere tom side) og 2)
belaste serveren mindst muligt med andet arbejde (db-opslag, indviklet
php-fortolkning).
Mht. pkt 2 havde jeg en idé om at et php-script ville være hurtigst, men
jeg skal gerne indrømme, at jeg ikke ved hvad htasccess, db (mySQL)
"koster" overfor min løsning.
mvh tb
| |
Erlend Klakegg Bergh~ (01-02-2006)
| Kommentar Fra : Erlend Klakegg Bergh~ |
Dato : 01-02-06 14:08 |
|
Tom Brøndsted skrev:
> Johan Holst Nielsen wrote:
>> Tom Brøndsted wrote:
>>
>>> Jeg har lavet et program (i c) der autogenerer en php funktion ud fra
>>> en ip-to-country.csv. Funktionen returnerer en tom side (exit'er),
>>> hvis den besøgendes IP er fra et område, jeg ikke ønsker besøg fra.
>>> Funktionen er en masse "if - else" sætninger, ialt ca. 100 kb. Dette
>>> er af mange grunde ikke optimalt. Hvad kan man ellers gøre?
>>
>>
>> Forstår ikke helt hvorfor der er SÅ mange if - elseif'er?
>>
>> Hvis det udelukkende er ip-to-country ville det (imho) være nemmere at
>> smide det i en database - og køre en enkelt forespørgsel og tjekke
>> landet?
>>
>> mvh
>> Johan
>
> Hvis der er et Denial of Service angreb, drejer det sig jo om 1) at
> skabe så lidt trafik som muligt (derfor returnere tom side) og 2)
> belaste serveren mindst muligt med andet arbejde (db-opslag, indviklet
> php-fortolkning).
>
> Mht. pkt 2 havde jeg en idé om at et php-script ville være hurtigst, men
> jeg skal gerne indrømme, at jeg ikke ved hvad htasccess, db (mySQL)
> "koster" overfor min løsning.
Du kunne lagt det inn i en database, men for å slippe å hente databasen
hver gang det kommer en ny IP bør du lage en blacklist i en fil som
inneholder registrerte IPer som skal blokkes, og heller la siden
kontrollere den hvis f.eks. $_SESSION["noblock"] = true (kontroll av
session før blokk). Jeg vil tro at du på den måten kan presse ned
arbeidet til serveren til et minimum.
--
Vennlig hilsen
Erlend Klakegg Bergheim
| |
Michael Zedeler (01-02-2006)
| Kommentar Fra : Michael Zedeler |
Dato : 01-02-06 18:09 |
|
Tom Brøndsted wrote:
> Johan Holst Nielsen wrote:
>
>> Tom Brøndsted wrote:
>>
>>> Jeg har lavet et program (i c) der autogenerer en php funktion ud fra
>>> en ip-to-country.csv. Funktionen returnerer en tom side (exit'er),
>>> hvis den besøgendes IP er fra et område, jeg ikke ønsker besøg fra.
>>> Funktionen er en masse "if - else" sætninger, ialt ca. 100 kb. Dette
>>> er af mange grunde ikke optimalt. Hvad kan man ellers gøre?
>>
>> Forstår ikke helt hvorfor der er SÅ mange if - elseif'er?
>>
>> Hvis det udelukkende er ip-to-country ville det (imho) være nemmere at
>> smide det i en database - og køre en enkelt forespørgsel og tjekke
>> landet?
>
> Hvis der er et Denial of Service angreb, drejer det sig jo om 1) at
> skabe så lidt trafik som muligt (derfor returnere tom side) og 2)
> belaste serveren mindst muligt med andet arbejde (db-opslag, indviklet
> php-fortolkning).
Men et stort PHP-script, der bliver kørt mange gange er også en
belastning. Det er oplagt at det vil performe rimeligt godt, men jo
tidligere man kan stoppe trafikken, jo bedre.
Her er en ret præcis beskrivelse af en blacklist i mod_rewrite:
http://httpd.apache.org/docs/2.0/misc/rewriteguide.html
Se afsnittet "Host Deny". Eksemplet skal modificeres så det kan tage
ip-intervaller og så det benytter en indekseret fil - f. eks. Berkeley
DB, dbm eller noget lignende.
> Mht. pkt 2 havde jeg en idé om at et php-script ville være hurtigst, men
> jeg skal gerne indrømme, at jeg ikke ved hvad htasccess, db (mySQL)
> "koster" overfor min løsning.
Jeg tror at performance vil være firewall < Apache < PHP-uden-RDBMS <
PHP-med-RDBMS.
Det hurtigste er altså hvis du kan blokere allerede i en firewall før
trafikken når din server.
Mvh. Michael.
--
Which is more dangerous? TV guided missiles or TV guided families?
Visit my home page at http://michael.zedeler.dk/
Get my vcard at http://michael.zedeler.dk/vcard.vcf
| |
|
|