Avatar billede and.vang Nybegynder
25. juni 2006 - 22:34 Der er 7 kommentarer og
1 løsning

Sikreste metode til validering af variabel

På et websted bruger jeg variablen $side til at bestemme hvilken .php-fil der skal inkluderes i en fast rammeside (index.php). For at opnå en øget sikkerhed - efter flere hackingangreb - ønsker jeg nu at validere denne variabel således at kun bestemte værdier (eksempelvis "produkter", "kontakt", "info", etc...) godtages og inkluderes i rammesiden.
  Imidlertid skal det være let for webmasteren at oprette nye sider, og da denne ikke har kenskab til php, vil jeg ikke kunne validere ud fra et array på rammesiden (hvori jeg i fald kunne skrive filnavnene på de tilladte sider). Oplysningerne om de tilladte værdier skal derfor komme andetsteds fra, hvor det er lettere for webmasteren at ændre og overskue.
  Der er vel flere muligheder; som jeg ser det kunne man enten lave en tekst-fil med de tilladte værdier og lade rammesiden validere ud fra denne, eller man kunne hente værdierne fra en database. Den sidste løsning ville imidlertid indebære at webmasteren skulle ændre i databasen ud fra en webbrugerflade - og det er vel ikke ligefrem sikkert ift. hacking...

Hvad vil være den sikreste metode? Er det evt. en helt tredje?

Mvh
Anders
Avatar billede hmortensen Nybegynder
25. juni 2006 - 22:46 #1
Ligge filerne i en undermappe, og sørg for der ikke er / eller \ i variablen.
Avatar billede and.vang Nybegynder
25. juni 2006 - 22:58 #2
Det er ganske vist ikke det du skriver, men dit svar har ikke desto mindre inspireret mig til en holdbar løsning. Jeg har mulighed for at lægge filerne udenfor mappen "public_html" (dvs. filerne herudenfor kan kun tilgås fra mine scripts) og tjekker så den pågældende side rent faktisk befinder sig dér... Det burde vel være ret skudsikkert(?)
Avatar billede erikjacobsen Ekspert
25. juni 2006 - 23:08 #3
Måske og måske ikke - kommer an på hvad du gør. En succesfuld hacker kan jo i hvert fald merer end een ting mere end dig - fx bruge et ".." så han kan komme til et andet katalog end du regnede med.
hmortensens forslag er faktisk både godt og nødvendigt, og lad mig blot slå fast, at man altid, altid, altid skal kontrollere - gerne dobbeltkontrollere - data, der kommer fra brugeren. Konkret vil jeg forslå dig at kontrollere at $side fx består at bogstaver og cifre før et ".html", og lade dine includefiler overholde det samme

  if (preg_match/'/^[a-z0-9}+$/',$side)) {
      include("/dit/hemmelige/katalog/$side.html");
  } else {
      header("Location: http://whitehouse.gov/");
      exit;
  }
Avatar billede hmortensen Nybegynder
25. juni 2006 - 23:14 #4
(retter lige et par småfejl i eriks linie)

if (preg_match('/^[a-z0-9]+$/',$side))
Avatar billede and.vang Nybegynder
25. juni 2006 - 23:32 #5
Jeg takker og bukker! I må begge smide et svar, så deler jeg lige over...

Men et brug af en ".." vil jo ikke føre ham tilbage i strukturen idet udefrakommende absolut kun kan få adgang til filer fra public_html og videre - og ikke niveauet før det. Og på den anden side skal jeg ikke kunne garantere for hackeres metoder...som I kan høre er jeg ikke specielt rutineret hvad sikkerhed angår...

Anyways, I har fortjent lidt point :)
Avatar billede erikjacobsen Ekspert
25. juni 2006 - 23:38 #6
Jo, som du har skitseret din løsning vil ".." evt efterfulgt af andre mappenavne, kunne bringe ham et andet sted hen end du ønsker. Jeg samler slet ikke på point, tak.
Avatar billede and.vang Nybegynder
25. juni 2006 - 23:43 #7
Well, ja, du har da helt ret. Jeg samler heller ikke selv - slet ikke på mine egne, så vi må håbe hmortensen vil have dem...
Avatar billede hmortensen Nybegynder
26. juni 2006 - 01:00 #8
Svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester