Hejsa Alle sammen.
Først og fremmest god jul derude.
Jeg har et lille problem jeg søger en løsning på. Uden at gå alt for meget i detaljer med hvorfor, har jeg brug for et script der kan gøre følgende via cron.
1: Søge efter referer linierne i apache loggen og finde linier hvor et vis domæne optræder.
2: Hvis en sådan linie findes, skal scriptet tjekke om der på samme linie findes en fil f.eks. /var/www/html/filer/*.zip
3: Hvis ovenstående "hits" findes, skal scriptet lave en rm /var/www/html/filer/filnavn.
Efter en del søgning rundt omkring har jeg ikke kunnet findet andre der har haft brug for noget lign. Så jeg håber nogle her kan fortælle mig mere, først om det overhovedet kan lade sig gøre eller om der er andre måder at gøre det på.
Mvh WAk
Avanceret script til webserver
-
- Admin
- Indlæg: 20878
- Tilmeldt: 15. nov 2009, 15:04
- IRC nickname: AJenbo
- Geografisk sted: Vanløse, København
Re: Avanceret script til webserver
Det ville hjælpe med en af disse linjer, men det bliver noget i stil med
Kode: Vælg alt
grep domæne.dit /din/log | grep -o '/var/www/html/filer/\S*\.zip' | xargs rm
-
- Indlæg: 47
- Tilmeldt: 21. aug 2010, 13:37
Re: Avanceret script til webserver
AJenbo skrev:Det ville hjælpe med en af disse linjer, men det bliver noget i stil medKode: Vælg alt
grep domæne.dit /din/log | grep -o '/var/www/html/filer/\S*\.zip' | xargs rm
Tusind tak Anders. Det ser jo meget fornuftigt ud. grep søger efter domænet, hvordan den info så kommer videre til en rm kommando er lidt sløret stadig.
Men her har du en linje fra loggen.
Kode: Vælg alt
localhost - - [14/Dec/2014:02:03:13 -0500] "GET /uploads/filnavn.zip HTTP/1.1" 200 31521710 "http://ref-domæne.dk" "Mozilla/5.0 (Windows NT 6.1; rv:31.0) Gecko/20100101 Firefox/31.0"
-
- Admin
- Indlæg: 20878
- Tilmeldt: 15. nov 2009, 15:04
- IRC nickname: AJenbo
- Geografisk sted: Vanløse, København
Re: Avanceret script til webserver
Første grep finder, som du skriver, linjer med domænet. Næste grep finder stien til zip filen via et mønseter, -o betyder den kun skal viderføre den del af linjen den har matchet og ikke hele linjen. Resultatet føres så videre til xargs som er et program der kan bruge en liste som parameter til en anden kommando, i det her tilfælde rm.
Du kan teste hvad komandoen kør ved at prøve den med en bid af gangen ved at klippe den ved hver pipe.
Eftersom loggen ikke ser ud til at indeholde den fulde sti kommer vi til at skulle ændre lidt på xargs kommandoen så den fulde sti bliver givet korrekt til rm, ændringen betyder desværre at vi kun slette 1 fil af gangen frem for alle i et huk. Vi er også nød til at have ; (true) da xargs ellers stopper hvis sletningen ikke lykdes (pga. filen eks. ikke eksistere):
Med den linje som du har givet som eks. vil overstående svare til:
Bemærk at der bruges \S* i mønsteret hvilket betyder et vilkårligt antal tegn der ikke er blanke (mellemrum, tabulator etc.). Det betyder at den også vil slette eks. "/var/www/uploads/.zip" men ikke "/var/www/uploads/min fil.zip". Du kan også få problemer med sær tegn da de nok er URL enkodet i loggen eks. "/var/www/uploads/æble.zip" vil fremstå som "/var/www/uploads/%C3%A6ble.zip" og der for ikke slette den ønskede fil.
Du bør også være opmærksom på sikkerheden her da det kan lade sig gøre for en hacker at slette vilkårlige filer hvis ikke du er forsigtig. Eventuel kan du filtere efter status 200 for at sikre dig at det kun er realle fil stier der bliver matchet og ikke /var/www/.../../backup.zip
Du kan teste hvad komandoen kør ved at prøve den med en bid af gangen ved at klippe den ved hver pipe.
Eftersom loggen ikke ser ud til at indeholde den fulde sti kommer vi til at skulle ændre lidt på xargs kommandoen så den fulde sti bliver givet korrekt til rm, ændringen betyder desværre at vi kun slette 1 fil af gangen frem for alle i et huk. Vi er også nød til at have ; (true) da xargs ellers stopper hvis sletningen ikke lykdes (pga. filen eks. ikke eksistere):
Kode: Vælg alt
grep ref-domæne.dk /var/log/apache2/access.log | grep -o '/uploads/\S*\.zip' | xargs -n 1 -I % bash -c 'rm /var/www%; (true)'
Med den linje som du har givet som eks. vil overstående svare til:
Kode: Vælg alt
rm /var/www/uploads/filnavn.zip
Bemærk at der bruges \S* i mønsteret hvilket betyder et vilkårligt antal tegn der ikke er blanke (mellemrum, tabulator etc.). Det betyder at den også vil slette eks. "/var/www/uploads/.zip" men ikke "/var/www/uploads/min fil.zip". Du kan også få problemer med sær tegn da de nok er URL enkodet i loggen eks. "/var/www/uploads/æble.zip" vil fremstå som "/var/www/uploads/%C3%A6ble.zip" og der for ikke slette den ønskede fil.
Du bør også være opmærksom på sikkerheden her da det kan lade sig gøre for en hacker at slette vilkårlige filer hvis ikke du er forsigtig. Eventuel kan du filtere efter status 200 for at sikre dig at det kun er realle fil stier der bliver matchet og ikke /var/www/.../../backup.zip
-
- Indlæg: 47
- Tilmeldt: 21. aug 2010, 13:37
Re: Avanceret script til webserver
Tusind tak for det dejlige svar AJenbo.
Det er rigtigt øv at man ikke kan fjerne alle filer der har den ref i et hug. Hvordan jeg så skal køre cron for at opnå det må jeg finde ud af.
En anden ting jeg har glemt. Alle filerne har en unik alpha-numeric kode. dvs. 4t64564g5.filnavn.zip.
Filnavnet kan være alt som du nævner, Japanske tegn, arabiske, øå osv. Så det kan give problemer, men det unike id foran bør være mere sikkert at bruge, hvis man kan.
Det gør ikke så meget om det 200 eller 404 koder der matcher. 99% af brugerne efterlader ingen referer, men den 1 procent der gør afslører hvilken fil der skal slettes. Jeg har udover det her også en referer block i apache2.conf på det her domæne.
Det er rigtigt øv at man ikke kan fjerne alle filer der har den ref i et hug. Hvordan jeg så skal køre cron for at opnå det må jeg finde ud af.
En anden ting jeg har glemt. Alle filerne har en unik alpha-numeric kode. dvs. 4t64564g5.filnavn.zip.
Filnavnet kan være alt som du nævner, Japanske tegn, arabiske, øå osv. Så det kan give problemer, men det unike id foran bør være mere sikkert at bruge, hvis man kan.
Det gør ikke så meget om det 200 eller 404 koder der matcher. 99% af brugerne efterlader ingen referer, men den 1 procent der gør afslører hvilken fil der skal slettes. Jeg har udover det her også en referer block i apache2.conf på det her domæne.
-
- Admin
- Indlæg: 20878
- Tilmeldt: 15. nov 2009, 15:04
- IRC nickname: AJenbo
- Geografisk sted: Vanløse, København
Re: Avanceret script til webserver
Det er ikke fordi kommandoen ikke sletter aller filerne, den gør det blot en fil af gangen i en sekvens frem for at slette dem alle samtidig hvilket kan tage lidt længere tid, men for dig betyder det nok ikke rigtig noget.
Jeg tror jeg springer over delen med at håndtere æøå, enten skal du URL dekode output inden det sendes videre til xargs ellers skal du finde en måde at erstatte filnavn delen med eks * inden den sendes til xargs.
Et tjek på 200 var af sikkerhedsmæsige årsager da forkerte stier vil give enten en 404 eller 30x, men og hvis du stadig vælger at følge dem vil kommandoen kunne udnøttes af hacker til at slette alle dine zip filer. Eks kan de lave:
Vil svare til:
Jeg tror jeg springer over delen med at håndtere æøå, enten skal du URL dekode output inden det sendes videre til xargs ellers skal du finde en måde at erstatte filnavn delen med eks * inden den sendes til xargs.
Et tjek på 200 var af sikkerhedsmæsige årsager da forkerte stier vil give enten en 404 eller 30x, men og hvis du stadig vælger at følge dem vil kommandoen kunne udnøttes af hacker til at slette alle dine zip filer. Eks kan de lave:
Kode: Vælg alt
localhost - - [14/Dec/2014:02:03:13 -0500] "GET /../../home/*/*.zip HTTP/1.1" 302 3154 "http://ref-domæne.dk" "Mozilla/5.0 (Windows NT 6.1; rv:31.0) Gecko/20100101 Firefox/31.0"
Vil svare til:
Kode: Vælg alt
rm /home/*/*.zip
-
- Indlæg: 47
- Tilmeldt: 21. aug 2010, 13:37
Re: Avanceret script til webserver
Tusind tak for svarene.
Jeg tror det er vigtigt at droppe *.zip tilgangen, det kan udnyttes som du siger og er ikke nødvendigt.
Alle filer har et unikt id. Som scriptet skal grappe. Dvs.
436545645h36.*.zip.
Den unikke del af filnavnet vil altid kun være tal og ingen specialle tegn der kræver * og på den måde kan man vel også undgå at skulle gå efter 200 koder og bekymre sig om hvad folk uploader.
Jeg tror det er vigtigt at droppe *.zip tilgangen, det kan udnyttes som du siger og er ikke nødvendigt.
Alle filer har et unikt id. Som scriptet skal grappe. Dvs.
436545645h36.*.zip.
Den unikke del af filnavnet vil altid kun være tal og ingen specialle tegn der kræver * og på den måde kan man vel også undgå at skulle gå efter 200 koder og bekymre sig om hvad folk uploader.