Gå til innhold

sikkerhet ved bruk av $_GET[] for å inkludere side


Anbefalte innlegg

Ble fortalt en gang at det å bruke linker av typen <a href="index.php?avd=avdeling&side=15"> var lite lurt, da "slemme" brukere kunne endre den infoen som ble sendt for å vise sider de ikke skulle eller ett eller annet. Ble anbefalt å lage ei php fil for hver side som skal vises, og bruke templates (phplib).

 

Nå synes jeg templates er helt genialt, men hadde det ikke vært enklere å bruke $_GET for å bestemme hvilken template som skal lastes? Det jeg lurer på er vel om det er så farlig å lage slike linke, og hva dere som er her pleier å gjøre/anbefaler.

Lenke til kommentar
Videoannonse
Annonse

God kveld :)

 

Mange vil nok si at switch er en god sak (søk p forumet, så finner du eksempler), jeg sverger nok til file_exists(mitt_domene/$_GET['fil]).

 

Grunnen til at det er skummelt å inkludere $_GET['side'] uten å sjekke den først, er at dersom man inkluderer en fil fra et annet domene, kan hackere og andre som synes slikt er gøy, inkludere f.eks. http://www.deg.no/index.php?side=skummel_skummel_fil.php og lage masse bøll med siden din.

Lenke til kommentar

switch er 100% sikkert, fordi det er du som bestemmer hvilke filer som skal inkluderes. Med include $_get['side']; er det brukeren som bestemmer hvilken side som skal inkluderes, og det er en sikkerhetsrisiko. En negativ ting med switch er at du må definere alle sidene selv, spørsmålet er da hvor langt man er villig til å gå for å opprettholde sikkerheten ved å bruke switch. Når man begynner å få sites med 100+ sider er det ofte fristende å gå for andre løsninger.

Lenke til kommentar

switch har ingen ting med sikkerthet eller noe å gjøre.

switch er bare en måte å velge hva som skal vises, i stedet for 200 linjer med heftige if/else.

Det er i utgangspunktet ikke noe usikkert rundt å bruke include og get, alt avhenger av hvordan du praktisk løser det.

Ikke inkluder filer som skrives rett i url. All bruker input skal sjekkes (og dette er bruker input).

Om noen forandrer url'en (som er kjekt og kunne gjøre som bruker) så skal du mest sannsynlig vise enten innholdet til den linken, eller en feilmelding (grunnet at det ikke eksisterer eller er retrsiksjoner på).

Bare tenk på hva brukeren får tilgang til når du løser det.

Lenke til kommentar

Forsøkte å vise a switch kan løse sikkerheten rundt include. Switch handler i utgangspunktet om hva som skal vises, men inneholder en validiering av variabel som er essensiel for å få switch til å fungere.

switch ($_GET['side']) {
case "kontakt":
  include "kontakt.php";
  break;

 

er sikrere enn

 

include $_GET['side']

 

Var det jeg hadde i tankene i innlegget ovenfor :) Switch er én måte å løse sikkerhetsproblematikken rundt include på. En annen, er som findus nevner, if/else:

 

$side = $_GET['side']; 

if ($side == "kontakt") {
include "kontakt.php";
} elseif($side == "forsiden") {
include "main.php";
}

 

En konkret måte å gjøre ting på, er

 

$side = $_GET['side'];

if (file_exists("inc/$side.php")) {
include "inc/$side.php";
} else {
include "error.php?feil=notfound";
}

 

edit: sansynligvis er det veldig mange måter å gjøre include "sikker" på, mist like mange som det finnes her.

 

Jeg bruker følgende når jeg skal inkludere sider (som en ekstra tilleggsforsikring):

 

main.php :

<?php
$key = "af4t34ga4t876t";
include "include.php";

 

include.php :

<?php
if ($key != "af4t34ga4t876t") {
exit();
} else {
echo "heihei";
}

Endret av fjartan
Lenke til kommentar

fjartan: Din metode er ikke sikker i det hele tatt. File_exists forsikrer bare at filen eksisterer, ikke at det er en av filene du har gitt tilgang til.

 

Om du har en fil i rooten din som heter hemmeligpassord.php. Da kan jeg få tak i den slik:

 

$_GET[side'] = "../hemmeligpassord";

 

$side = $_GET['side'];

 

if (file_exists("inc/$side.php")) { // inc/../hemmeligpassord.php finnes

include "inc/$side.php"; //inkluderer denne

} else {

include "error.php?feil=notfound";

}

 

Altså, man kan inkludere en hvilken som helst PHP fil ved å bruke ../. Dette er ikke særlig sikkert. Skal man bruke include via URL burde man lage en array over lovlige includefiler, eller bruke en if- eller case-test.

Lenke til kommentar
RipZ-

En trenger ikke å lage en array, bare sjekke at filnavnet kun består av boktaver og tall - på den måten kommer de ikke ut av mappen. Bruk f.eks. eregi("[a-z0-9]+").

Er klar over det. Men det kan hende man ønsker å inkludere forskjellige filer fra forskjellige mapper. Selvfølgelig, man kan bruke REGEXP i dette tilfellet også. Jeg ville personlig gjort det, siden å lage et array synes jeg er for tungvindt. Men mange nybegynnere er ikke så flinke til å skrive REGEXP (er jo gjerne noe man lærer litt senere om man ikke har tidligere erfaring med det) og har derfor en tendens til å enten å ikke få til å lage en selv, eller at de rett og slett lager den for usikker.

Lenke til kommentar
Hehe... du har helt rett - alle kan glemme ting - jeg glemte ^$ :p

Heldigvis bruker jeg mer tid på egene koder enn den hva jeg bruker på å lage eksempler.

Var ikke det beste eksempelet jeg har sett nei... :D

Lenke til kommentar

Regexp finnes i de fleste programmaringsspråk.

 

Bruk en streng regexp, som f.eks. "^[a-z0-9]$" da kan den kun inneholde bokstaver og tall så da er det ikke mulig å inkludere sider fra andre mapper. Eventuelt så kan du bare legge til en bokstav på alle sidene:

include "a".$_GET['side'].".php";

Lenke til kommentar

jeg vet hva regulære uttrykk er, lurte bare på om det var helt standard i php også. og det ser det jo ut som det er. men du anbefaler altså å bruke den metoden?

 

jeg er veldig ny i det med å lage sider i php, så vet ikke helt hva som er vanlig. hvor mange php sider trenger jeg egentlig da? alt kan jo i teorien inkluderes, samme hvor mange sider jeg vil vise, fra index.php, men er det vanlig å gjøre det på den måten? og hva bør puttes i en database? nå har jeg hovedmenyen i en array som legges til vha templates, slik at det er lett å legge til og fjerne element fra alle sidene. men det er jo også en ting som i teorien kan ligge i en database... og vil ting gå mye tregere hvis den må hente all info fra databasen?

 

ble ganske off topic dette, men håper noen kan hjelpoe meg like vel, prøver å bli så flink som mulig :)

Lenke til kommentar

Hehe... du stiller spørsmål som ikke kan besvares uten motspørsmål. Kommunikasjonen mot en database behøver ikke å være treg, dersom webserveren og sql serveren har en rask forbindelse med hverandre. Ofte er de til og med på samme fysiske maskin, eller koblet til samme router - så da er kommunikasjonen rask. Benytter du deg av en ekstern server plassert i et annet kontient kan du begynne å merke hastighetstak, men det som regel snakk om hundredeler like vel. Kjører du da 50 spørringer på databasen, så er det selvfølgelig en flaskehals for scriptet ditt.

 

Vanligvis tar spøringer veldig liten tid, så lenge det er enkle select spørringer på en mindre database. Har du flere hundre tusen rader i tabellen vil sql serveren bruke litt tid på å finne all data'en - og det er da viktig at du benytter deg av indekser.

 

Hvis du f.eks. går inn på vg.no så hentes sikkert nesten alt der fra en database, og på denne siden kan du se nederst at den har gjort 13 spørringer mot sql serveren.

 

Forskjellen mellom å velge å inkludere filer eller hente fra en database, er veldig liten og det kan ofte være like raske eller raskere å hente ting fra en database.

 

Tilbake til regexp så velger du den løsningen du synes er eklest. Så lenge det ikke er snakk om en kjempestor side, med mange besøkende og sider, så vil det utgjøre lite forskjell hvilken av delen du velger.

Endret av ????????
Lenke til kommentar

apache og mysql er på samme maskin, så da skal ikke hastigheten være noe problem. med menyer og slikt i en databse vil det vel bli enklere å vedlikeholde og endre på ting for folk som ikke har så mye peiling, eller ikke har tilgang til serveren.

 

tenker jeg prøver meg på en side pr avdeling, og sidene under hver avdeling som inklude, så får jeg se hvordan det går. og med innholdet i database, så får jeg lært det og:)

 

tusen takk for all hjelp!

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å
×
×
  • Opprett ny...