-Teddy- Skrevet 15. desember 2006 Skrevet 15. desember 2006 Jeg skal bruke et includescript, og vet at det er lett å msibruke disse. Hvordan skal jeg validere input'en fra $_GET ? Denne bruker jeg på e-poster (noe omskrevet, bl.a. fra post til get), holder dette? if (eregi('^[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.([a-zA-Z]{2,4})$', $_GET['side'])) {
shaker Skrevet 15. desember 2006 Skrevet 15. desember 2006 (endret) Kan bruke switch. Da fungerer bare de "fil.php?side=bla" du selv har definert. <?php switch ($_GET['side']) { case "side1": $file = "side1.php"; break; case "side2": $file = "side2.php"; break; default: $file = "default.php"; } include($file); ?> Eller så kan du gjøre noe sånt som det her <?php $filer = array("side2.htm","side2.php"); // kan f.eks bruke scandir() i PHP5 til å fylle array med filer fra en mappe if(in_array($_GET['side'],$filer)) { include($_GET['side']); } else { echo("Nei nei hva driver du på med?"); } ?> Er mange løsninger Endret 15. desember 2006 av shaker
Martin A. Skrevet 15. desember 2006 Skrevet 15. desember 2006 Se hvordan jeg gjorde det her: https://www.diskusjon.no/index.php?showtopic=681274
Beethoven Skrevet 15. desember 2006 Skrevet 15. desember 2006 valider GET med basename() og fjern html.
-Teddy- Skrevet 15. desember 2006 Forfatter Skrevet 15. desember 2006 Hva mener du med det Beethoven? Når man er sikret mot nullbyte er det vel ikke vits i å i tillegg bruke $file = basename($path, ".php"); for å garantere at det er .php til slutt? Eller har jeg misforstått basename(), jeg slo det bare opp på php.net
genstian Skrevet 15. desember 2006 Skrevet 15. desember 2006 <?php $side = $_GET['page']; $side = str_replace(array("'", '"', '@', '.', '\', '/', '<', '>', '[', ']', '(', ')', '?', '*', '$', '%', '!', '{', '}'), '', $side); if(is_file('mineModuler/'.$side)) include('mineModuler/'.$side); else { die("På ville veier, hva?"); } ?>
-Teddy- Skrevet 15. desember 2006 Forfatter Skrevet 15. desember 2006 En regel jeg har lært meg er at man ikke skal etterbehandle invalid data for å gjøre de valide. Er det et invalid input er det nok noen som prøver seg på noe snusk. Har tittet litt på Martins script, fikset litt selv og slengt ihop et script jeg selv syns ser nogenlunde sikkert ut ikveld. Eneste er at noen kan ha det moro med å sende meg en masse e-poster. Skal se om jeg ikke finner en måte å unngå det på. (Blokkere etter 50 e-poster e.l.) Jeg har ikke planer om å bruke scriptet på annet enn bestemte undersider i porteføljen min, og side skal alltid være definert. Noen som vil se om jeg har latt en dør stå åpen eller vil hjelpe meg / gi feedback på scriptet? Har ikke så mye erfaring, men har skjønt at sikkerhet er viktig. // php-taggene i forumet gir meg tekniske problemer, får bruke code.. <?php $side = $_GET['side']; $Til = '[email protected]'; // Sjekker om $side er tom if(!empty($side)){ // Sjekker for null-byte if(!preg_match("#\.\./|^/#", $side)){ // Sjekker om filen eksisterer if(file_exists('les_mer/foto/' . $side . '.html')){ include('les_mer/foto/' . $side . '.html'); } // Hvis filen ikke eksisterer else{ $IP = $_SERVER['REMOTE_ADDR']; // Om $IP er endret i forsøk på hacking if(preg_match("#\.\./|^/#", $IP)){ echo "Bad input. Incident logged"; } //Om $IP er fin, send e-post else{ $Hostname = gethostbyaddr($IP); $dato = date('dmyhi'); $Beskjed = " $side ble kalt, men filen den referrer til eksisterer ikke. IP: $IP Host: $Hostname Tidspunkt: $dato "; $Emne = 'Feil IP'; mail($Til, $Emne, $Beskjed, "From: Sikkerhet" ); echo "Filen eksisterer ikke. Hendelsen logget."; } } } // Om null-byte funnet else{ $IP = $_SERVER['REMOTE_ADDR']; // Om $IP er endret i forsøk på hacking if(preg_match("#\.\./|^/#", $IP)){ echo "Bad input. Incident logged"; } //Om $IP er fin, send e-post else{ $Hostname = gethostbyaddr($IP); $dato = date('dmyhi'); $Beskjed = " $side ble sendt, den passerte ikke null-byte testen. IP: $IP Host: $Hostname Tidspunkt: $dato "; $Emne = 'Feil IP'; mail($Til, $Emne, $Beskjed, "From: Sikkerhet" ); echo '<p>Bad input. Incident logged</p> <p>Feil inndata. Hendelsen logget.</p>'; } } } // Om $side ikke definert else{ include("404.php"); } ?>
genstian Skrevet 15. desember 2006 Skrevet 15. desember 2006 Eneste jeg ser i skrivende stund er at du kan gå til mapper i side(side=extFolder/secret) og at den ikke er windows safe(side=C:\-\-\-\-\file).
dabear Skrevet 15. desember 2006 Skrevet 15. desember 2006 Forklar meg nullbyte og hvorfor det er viktig å sikre seg mot det, teddy
-Teddy- Skrevet 15. desember 2006 Forfatter Skrevet 15. desember 2006 (endret) Den skal kjøre på en UNIX-sever, men det kan jo være greit å fikse det allikevel i tilfelle jeg kommer til å bytte en gang. Jeg har ikke snøring på hvordan jeg legger til tegn det skal søkes etter i preg_match, kan du/noen andre forklare? Hvordan skal man komme inn i extFolder? Man kommer jo inn i les_mer/foto Her skal jeg kun ha harmløse htmlfiler. Hvordan skal man kunne jobbe seg oppover eller nedover fra denne mappen? Trodde noe av dette ble behandlet i jakten på nullbyte i preg_match jeg. EDIT: Kunne vel trengt å vite mer om det egentlig dabear. Mulig jeg ikke trengte det på $IP, men jeg leste en gang: "Validate all input". Mulig jeg gjør det på feil måte, men jeg vil gjerne lære mer om sikkerhet. Lånte boka innocent code i noen uker, men fikk ikke gått virkelig i dybden i alle kapitlene. Trodde man jaktet på nullbytes for å unngå at man skulle kunne "hoppe over" en, ja f.eks en filendelse sjekk i et includescript. $IP er ikke brukt til noe slikt, så vet vel egentlig ikke helt om det er noe vits i å behandle den på noe vis. Trenger erfaring. Endret 15. desember 2006 av -Teddy-
genstian Skrevet 16. desember 2006 Skrevet 16. desember 2006 (endret) Testen til -Teddy- sikrer deg mot at ?side=../ etc. Forøverig kan vel preg_match se slik ut: preg_match("#\.\./|/|\\|:|%#", ***) utestet. EDIT: Glemte % seff. Endret 16. desember 2006 av hotstian
olemedkrutt Skrevet 16. desember 2006 Skrevet 16. desember 2006 <?php include("./inc/" . $_GET['page'] . ".php"); ?> Nullbyte trikset betyr å gå ?page=foobar%00, da vil man kunne åpne andre filer uten .php ending. ?page=../../../../../etc/passwd%00 Vil da lese passwd Dette funker dog bare hvis magic_qoutes er av.
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå