Gå til innhold

Tilbakemelding på perl sikkerhetsscript


Anbefalte innlegg

Heisann folkens :)

Har ikke drevet med Perl på en god stund nå, men hadde lite å gjøre og bestemte meg for å gjenoppbygge kunnskapene litt. Tenkte derfor å lage et lite script som koblet seg opp til en webserver og så etter et bestemt ord og deretter lagret det til en lokal fil. Da jeg hadde holdt på med det en stund la jeg bare til mer og mer, og endte til slutt opp med følgende script:

 

Scriptet kobler seg opp til en webserver og ser etter kildekoden til PHP filer. Det er ikke ment som et hackerverktøy, men mer som en sikkerhetssjekk for å sikre at du ikke har latt noen kildefiler ligge igjen på nettstedet ditt.

 

Vil gjerne ha kommentarer på sourcekode (har prøvd å kommentere den så godt som mulig...) :)

 

Source finner dere i pastebin her:

http://pastebin.ca/236637

 

Eller dere kan laste ned filen under :)

hostchecker.perl

Lenke til kommentar
Videoannonse
Annonse

Hei, det var et langt script som sikkert kan kommenteres i det lante og det brede. her er et par kommentarer:

 

1) Bra at du bruker use strict! Veldig bra!

 

2) Getopt::Long er fin for command line options. Synd å finnd opp for mange hjul

 

3) bruk "x" operatoren istedet for en for-loop, ex: print STDOUT "#" x $div1

 

4) smakssak, men jeg pleier å bruke unless() istedet for if(! ). Synes skoden blir behageligere lesbar da.

 

5) URI er ganske fin for også å parse URI's

 

6) Du trenger sjelden sette 0 som startverdi for et flag, ex: $blacklisting = 0; # det holder med å bare definere variabelen så er den også false i alle logiske sammenhenger

 

7) File::Slurp er med i core og fin for å lese inn filer i ett. Den er binært sikker og. istedet for open, @arr=<foo>; close type kode.

 

8) Istedet for if ($customdirfile != 0) kan du si if(!$sustomdirfile) eller unless($customdirfile). se 4)

 

9) bruk "or die" når du åpner filer! open(LOGOUT, ">$logtofile") or die "failed opening log file!\n"; # file opens er ofte kritiske.

 

10) en webserver trenger ikke svare på ping. trenger du sjekke dette? (det begrenser bruken av scriptet til root!)

 

11) LWP::UserAgent håndterer cookies ganske bra. Trenger du virkelig noe annet enn default cookie-oppførsel? ex: my $ua = new LWP::UserAgent( agent => $agentstring, cookie_jar=>{ file => "$ENV{HOME}/.cookies.txt" } );

 

12) kjenner du for-loop syntaksen som går slik: for my $ext ( @commonexts ){ ...

Det er unødvendig å sette opp teller apparat opp til størrelsen av en array hvis du kun skal bruke tellervariabelen til å hente ut gitte element fra dette arrayet.

 

13) bruk == 200 og ikke regex =~ /200/ ! Husk at det er mye mer enn 200 som er "ok", bruk din useragents "is_success()" metode hvis det er dette du ønsker å sjekke

 

14) Trenger du å open VALID for append hver gang, holder det ikke å åpne denne for append en gang utenfor loopen og skrive til VALID hver gang du føler for det?

 

15) open(READ200, .... # <---- File::Slurp forenkler slik kode såpass mye at du vil fort venne deg til denne istedet

 

16) HTTP error codes er mye mer nyansert enn det bildet du gir brukeren av ditt script!

 

17) hvorfor trenger du sleep? Tar ikke disse operasjonene lang nok tid til at brukeren "synes" at han kjører et program? :) Eller hvis du ikke vil stresse webserverene, så ok.

 

18) du demonstrerer god forståelse av streams ved din bruk av select :)

 

19) trenger du sette navn på din if-setning? bruk kommentarer!

 

Det var en første-revisjon, andre har sikkert andre kommentarer og du har antagelig mot-kommentarer

Lenke til kommentar

Wow! Takk for kommentarer :D

 

Har gjort en del endringer nå, men noen småting...:

5) Hvorfor burde jeg bruke den istedenfor?

11) Nei, gjør vel ikke det, men synes syntaxen var lettere + at man ikke trenger en separat fil :)

12) Jeg kan ikke bruke den syntaxen grunnet:

PHP

splice(@commondirs,$i,1); # Removing folder from folder list

 

#Reset for loops

$j = -1;

$k = -1;

if ($i == @commondirs)

16) Trengs det virkelig å gis så mye mer informasjon?

17) Er for å ikke stresse serveren ja :)

19) Kommentert ^^

 

Ny revisjon av scriptet på linken under

http://jonhoo.web.surftown.nu/Share/hostchecker.perl

Lenke til kommentar

hei, johno bra du deler kode.

 

Kunne ikke scriptet ditt vært smelt sammen til en par linjer montro vha LWP::Simple og en for-loop? du henter jo bare ned endel urls og sjekker innhold, eller? Du kunne evnt starte et par tråder for å få gassen opp litt på testing (om en har mange sider som skal testes (tråder er grise enkelt å lage i perl))

Lenke til kommentar

Har du noen god introduksjon til hvordan lage dem?

Husk at jeg ikke har drevet med dette paa en stund ^^

 

PS: Tror ikke det ville kunne bli kortet ned veldig med LWP::Simple fordi jeg analyserer tilbakemeldingen jeg faar for hver request... Hvordan skulle dette gaatt noe fortere med LWP::Simple?

Endret av Jonhoo
Lenke til kommentar

du vet du kan bruke:

 

$connector->get( "http://".$host );

 

jeg har aldri trengt å lage min eget HTTP::Request objekt på egenhånd. LWP::UserAgent håndterer alt slikt selv.

 

EDIT:

 

og dette trenger du ikke:

 

foreach (@forks) {

waitpid($_, 0);

}

 

programmet vil selv vente på sine children... wait trenger du for å begrense hvor mange du eventuelt ville ønske å kjøre samtidig. du forker jo alt uansett nå.

Endret av Torbjørn
Lenke til kommentar

Jeg aner ikke hvorfor jeg gjorde det saa tungvindt med $connector jeg :p Fikset naa ;)

 

jeg trenger at programmet venter akkurat der nettopp fordi jeg vil at de siste handlingene skal bli kjoert kun en gang.. Eller er det jeg som har misforstaatt forking? ^^ (Det kan forsaavidt godt vaere... Leste bare en kort guide paa det i dag.. :) )

Lenke til kommentar

-tror han (torbjørn) mener å dele koden opp i subrutiner. det er nødvendig for å gjøre koden mer oversiktelig og lettere å teste.

 

-hvorfor bruker du cookies? disse filene som du ser etter vil ikke være beskyttet av cookies?!

 

-mange server svarer ikke på ping.

 

-i fork'en din, ser det ut som at du blander child og parent (parent får pid til child).

 

-unless er evil : )

 

forøvrig interessant å se bruk av LWP::ConnCache.

Lenke til kommentar

1. Hmm.. Skal ta en titt paa hva som kan gjoeres..

2. Jeg bruker ikke cookies med mindre brukeren oppgir at han vil bruke det.. Dette er i tilfelle en server benekter tilgang med mindre du har en bestem cookie.

3. Derfor exiter jeg ikke hvis den ikke svarer...

4. Blander dem? Hvordan da? Det er noedvendig at jeg henter inn alle PIDene og legger dem inn i en array..

5. Fikk beskjed av torbjoern at det var mer oversiktlig :p

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...