Avanceret script til webserver

Få hjælp til at sætte programmer eller funktioner op.
DoYouSpeakWak
Indlæg: 47
Tilmeldt: 21. aug 2010, 13:37

Avanceret script til webserver

Indlæg af DoYouSpeakWak »

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
AJenbo
Admin
Indlæg: 20878
Tilmeldt: 15. nov 2009, 15:04
IRC nickname: AJenbo
Geografisk sted: Vanløse, København

Re: Avanceret script til webserver

Indlæg af AJenbo »

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
DoYouSpeakWak
Indlæg: 47
Tilmeldt: 21. aug 2010, 13:37

Re: Avanceret script til webserver

Indlæg af DoYouSpeakWak »

AJenbo skrev: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



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. :D

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"
AJenbo
Admin
Indlæg: 20878
Tilmeldt: 15. nov 2009, 15:04
IRC nickname: AJenbo
Geografisk sted: Vanløse, København

Re: Avanceret script til webserver

Indlæg af AJenbo »

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):

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
DoYouSpeakWak
Indlæg: 47
Tilmeldt: 21. aug 2010, 13:37

Re: Avanceret script til webserver

Indlæg af DoYouSpeakWak »

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.
AJenbo
Admin
Indlæg: 20878
Tilmeldt: 15. nov 2009, 15:04
IRC nickname: AJenbo
Geografisk sted: Vanløse, København

Re: Avanceret script til webserver

Indlæg af AJenbo »

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:

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
DoYouSpeakWak
Indlæg: 47
Tilmeldt: 21. aug 2010, 13:37

Re: Avanceret script til webserver

Indlæg af DoYouSpeakWak »

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.