Gå til innhold

Anbefalte innlegg

Hei!

 

Jeg har sett meg lei på at folk bruker $_GET til å inkludere sider på feil måte.

Oftest er det mulig å inkludere filer fra andre servere og fra steder på serveren som skal være forbudt.

 

Andre har også oppdaga dette, og har derfor har begynt med switch-der du må skrive inn hver side som kan innkluderes i kildekoden. Dette er lite praktisk, og dumt hvis du har maaange sider. Dessuten liker ikke søkemotorer ofte ?include=stuff.

Her kommer ei løsning på hvordan man man kan bruke $_GET samtidig som den er sikker og søkemotor-kompitabel. Det kreves at du har mod_rewrite for å gjøre den søkemotor kompitabel, men du kan også bruke den "på vanlig måte".

 

Koden (kan fks. inkluderes fra ei ekstern fil.):

<?php
function inclusion($dir = './', $suffix = '.php', $defaultside = 'hoved.php' , $includeparameter = 'i')
{


$ex = array('.', '..'); //filer som skal strippes \ viktig /


//Hvis  parameter $dir er ei mappe og det går an å lese fra den, lag et array med liste over alle filer
if (is_dir($dir) && $dh = opendir($dir))
{
      while (($file = readdir($dh)) !== false)
      {
       if(in_array($file, $ex)){continue;}
          $allowed_files[] = $file;
      }
      closedir($dh);
  
}

//få directory fra bruker
$include = $_GET[$includeparameter];
//strippe potensielle farer
$include = str_replace(array('..', '//', 'ftp'), '', $include); 
$include = strtolower($include);

   if(in_array($include . $suffix, $allowed_files))
   {

       include($dir . $include . $suffix);

   }
   else
   {
   //fila som blei forespurt av brukeren finnes ikke i arrayet
   
   //hvis brukeren i det heletatt har skrevet inn ei side for å inkludere
       if($_GET[$includeparameter])
       {

           //hvis brukeren har blitt videresend, e.g. trykt på en link 
           if($_SERVER['HTTP_REFERER'])
           {

               echo '<div>øhh, det virker som om linken du trykte på, ikke virka. Feilen vil bli retta så fort som mulig.</div>';

           }
           else
           {
           //hvis brukeren har skrevet inn adressen manuelt

               echo 'Sorry, sida du skreiv inn finnes ikke. Gå tilbake til <a href="http://' . $_SERVER['HTTP_HOST'] . '">hovedsida</a>';

           }
       

       }
       else
       {
       //hvis brukeren ikke har skrevet inn adresse / trykt på lenke, og fila ikke finnes i array. E.g. startsida
           include($dir . $defaultside . $suffix);


       }


   }


}//end function

 

 

Forklaring av parametre i funksjonen inclusion:

 

<?php

$dir; //hvilken mappe å leite etter filer på server
$suffix; //tillatt fil endelse
$defaultside; // deafultside hvis $_GET[$includeparameter] er tom
$includeparameter; //include med hvilket element fra $_GET? default sidami.suffix?i=include_side_uten_endelse


?>

 

Hvordan bruke funksjonen:

<?php
// (kopier og lim inn koden her / inkluder koden)
inclusion();  /*dette vil inkludere hovedsida.php hvis $_GET ikke er satt, eller inkludere fila spesifisert i  $_GET['i'] (default) i lowercase pluss suffixen (default: .php) */
?>

 

Hvis jeg vil at sida skal baseres på .inc-filer som ligger under mappa /inkludere, hvor default side er default.inc, og i tillegg bruke $_GET['inkludere'] istedet for $_GET['i'], kan jeg gjøre følgende:

 

<?php
inclusion('./inkludere', '.inc', 'default.inc', 'inkludere');
?>

 

Søkemotoroptimalisering (mod_rewrite må være tilgjengelig):

 

Dette er jeg ikke helt stødig på, så kom gjerne med bedre forslag.

 

Lag ei fil kalt ".htaccess". I denne legger du følgende kode (ev. bytt ut "index.php"-biten), og last opp til server rota (sjekk at du har rettigheter til å bruke .htacess):

RewriteEngine On
RewriteRule    (i)/([a-zA-Z_]+)  index.php?$1=$2 [L]

Dette gjør at fks dittdomene.com/i/hovedsida vil være et alias for dittdomene.com/index.php?i=hovedsida osv.

 

Ønsker du seinere å ta med flere parametere i get enn kunn de to, kan du istedet bruke dette i .htaccess:

 

RewriteEngine On
RewriteRule (i)/([a-zA-Z_]+)(/([a-zA-Z_]+)/([a-zA-Z_]+))? index.php?$1=$2&$4=$5 [L]

 

 

Dette gjør at det er påkrevd med i/eiellerannaside

Men hvis du vil ha med flere, fks ?i=eiellerannaside&bil=volvo , bruker du denne linken: i/eiellerannaside/bil/volvo

 

 

tekst i rødt: Oppdatert 24.Nov 04 . Oppdaterte òg php-koden med kommentarer

Endret av dabear
Lenke til kommentar
  • 2 måneder senere...
Videoannonse
Annonse
  • 1 måned senere...

Hindrer denne metoden at man har f.eks. index.php?bil=volvo?

 

kan man ikke ha noen andre $_GET-parametre hvis man ikke har ?i=foo?

 

Cutenews klager.. :/

 

 

Warning: file(./data/comments.txt) [function.file]: failed to open stream: No such file or directory in d:\htdocs\sintfjes\news\inc\functions.inc.php on line 229

Lenke til kommentar

Hvis du bruker mod_rewrite og .htaccess-metoden må du tilpasse denne for å virke med flere parametere.

Har hørt om flere som har hatt problem medcutenews scriptet, visstnok bare på servetheworld. Grunnen er visstnok at cutenews bruker en relativ sti for å åpne kommentarer, denne må derfor endres til en absolutt sti.

 

Finn dette i functions.inc.php:

   if($cutepath == ""){ $cutepath = "./cutenews"; }

Dette må endres til den absolutte stien til cutenews mappa

Lenke til kommentar

Jeg bruker en switch for å styre hva som skal vises i en boks på sida mi, avhengig av hvilken side som blir inkludert i hovedruta, altså hva $include er.

 

Før jeg brukte dette funka det fint med switch($_GET), men det funker ikke nå, hverken med $_GET eller $include. Er det fordi variabelen $include kun er tilgjengelig fra inni funksjonen? Hvordan kan jeg i så fall fikse dette?

Lenke til kommentar

Scriptet mitt skal ikke påvirke de globale verdiene direkte,. Grunnen til at jeg bruker $_GET[$include] inne i scriptet er fordi at en skal kunne sette etter hvilken key i arrayet $_GET som skal brukes til å inkluderes. Derfor, hvis du fks har brukt denne koden for å inkludere

 

<?php

inclusion('./inkludere', '.inc', 'default.inc', 'inkludere');

?>

 

Vil scriptet leite etter inkludering gjennom $_GET['inkludere']. Da må du med andre ord kjøre en switch på $_GET['inkludere']

 

Har du flere spørsmål, kontakt meg gjerne på mail eller pm, da får du svar kjappere ;)

Lenke til kommentar
  • 6 måneder senere...
  • 2 måneder senere...
  • 3 år senere...

Jeg har implementert funksjonen din på siden min nå. Slik det er nå så inkluderer jeg alt som ligger i mappen ./pages/ vha index.php?side=x.

 

Det jeg lurte på nå var: hvis jeg f.eks. har en mappe som heter ./pages/portfolio/, hvordan får jeg inkludert dem hvis linken er index.php?side=portfolio&portfolio=foto ?

 

Det jeg også vil er at det skal kjøres ett annet layout hvis en side begynner med foto.blabla (altså index.php?side=portfolio&portfolio=foto.blabla).

 

 

Et eksempel på hva jeg mener med et annet layout når filen begynner med foto. kan dere se her:

 

http://horgenweb.org/portfolio.php?side=foto - hvis dere trykker på et av bildene har vil dere se at et annet layer bli brukt.

Endret av exmx
Lenke til kommentar

Du kan inkludere portfolio mappen fra portfolio.php med /pages/portfolio/portfolio/foto , /pages/portfolio/portfolio/foto.noe eller /pages/portfolio/portfolio/foto/picture/noe

Det er kanskje enklere med /pages/portfolio/foto/noe eller /portfolio/foto/noe

 

Det å kunne kjøre forskjellige layouts er der det å skille logikk og presentasjon kommer inn i bildet. Vet ikke hvordan oppsettet ditt er.

 

Edit: Du burde absolutt få din post skilt ut som eget emne i PHP forumet.

Endret av OIS
Lenke til kommentar

function CheckInclude($name, $path)
{
return (!preg_match("/[^\w]/", $name)) && file_exists($path);
}

 

if(CheckInclude($title, $page_name))
include($page_name);
else
echo "Page was invalid or file not found.";

 

Er det jeg bruker, er ikke det nok?

Tror ikke jeg har tatt så mange sikkerhetshensyn når det gjelder akkurat dette kjenner jeg...

Endret av GeirGrusom
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...