petterk Posted June 17, 2013 Posted June 17, 2013 Hei, holder på med et "include" perl-script for å lage en enkel løsning på nettsiden min med dynamisk footer/header/innhold. Problemet er at jeg får feil, selvom jeg egentlig ikke skal få feil #!/usr/bin/perl use warnings; use strict; use CGI qw(:standard); # Filplasseringer: my $header_file = '/home/xxx/public_html/include/header.inc'; # Header my $footer_file = '/home/xxx/public_html/include/footer.inc'; # Footer my $content_dir = '/home/xxx/public_html/include'; # Innhold # Lovlige filtyper my @safe_files_ext = qw( inc ); # Spesifisert innholdside my $query = new CGI; chomp(my $page = $query->param('page') || ''); # Fjern mellomrom $page =~ s/\s+//g if ($page ne ""); # Vis header (for CGI): print header(); # Statisk fil (0) eller spesifisert fil (1) : read_file(0, $header_file); read_file(1, $content_dir . '/' . $page) if ($page ne ""); read_file(0, $footer_file); # Hvis lovlig, vis fil sub read_file { my ($in_page, $file) = @_; if ($in_page) { # Hvis fil er spesifisert error("Invalid syntax") if ($file =~ /\.\./); foreach my $file_ext (@safe_files_ext) { # Sjekk hver filtype # Stopp og vis feilmelding hvis ulovlig error("Invalid syntax for $file") if ($file !~ /\.$file_ext$/i); } } # Hvis lovlig, vis fil open(FILE, $file) or error("Can't open $file $!"); # Vis feilmelding hvis annen type feil # Ekstra ting kommer her print while (); # Print file line by line for best efficiency. close(FILE); } # Vis feil og avslutt sub error { my $reason = shift; print "Error: $reason\n"; exit; } EDIT: Løste det, hadde gjort en bommert selv når jeg spesfiserte lovlige filtyper.. hehe. Share this post Link to post Share on other sites More sharing options...
PRO ISP Jon Eivind Posted June 18, 2013 Posted June 18, 2013 Hei petterk, Fort gjort Takk for oppdateringen! Share this post Link to post Share on other sites More sharing options...
petterk Posted June 18, 2013 Posted June 18, 2013 Har forsåvidt et spørsmål til i forbindelse med det scriptet: Mulig å gjøre det slik at jeg kan ha ?page=main, og ikke ?page=main.inc,men at samme fil blir calla? Altså at den selv leter etter main.inc/shtml, uten at jeg må spørre etter det direkte. EDIT; Løste det. read_file(1, $content_dir . '/' . $page) if ($page ne ""); endres til read_file(1, $content_dir . '/' . $page . '.inc') if ($page ne ""); Share this post Link to post Share on other sites More sharing options...
PRO ISP Jon Eivind Posted June 18, 2013 Posted June 18, 2013 Ja, det kan jo løses slik, men vær svært forsiktig med å gjøre det slik. Du bør da alltid sjekke nøye strengen som kommer inn slik at hackere ikke endrer den slik at de får tilgang til mer enn ønskelig. Du kan også benytte deg av mod_rewrite for eksempel. Share this post Link to post Share on other sites More sharing options...
petterk Posted June 19, 2013 Posted June 19, 2013 Hei Jon Eivind, det har jeg tenkt mye på! Hvis du ser på # Lovlige filtyper my @safe_files_ext = qw( inc ); , er det kun filer som ender i .inc som vil bli brukt, slik at man ikke kan bruke enkle triks som ?page=../../../../etc/passwd f.eks! I tillegg antar nå scriptet at alle filer slutter på .inc fra før av, f.eks ?page=main tilsvarer main.inc, og uavhengig av om en fil heter main.exe, så vil den aldri bli brukt fordi den da vil bli called som main.exe.inc. Share this post Link to post Share on other sites More sharing options...
PRO ISP Jon Eivind Posted June 20, 2013 Posted June 20, 2013 Hei petterk, Flott! Mod_security vil normalt sett også fange opp de mest vanlige av disse angrepene. Share this post Link to post Share on other sites More sharing options...