Gå til innhold

Sikkerheit på dette scriptet?


Anbefalte innlegg

Videoannonse
Annonse

Det ser faktisk meget bra ut. Du har fått med deg et viktig element, og det er å hindre at index.php (regner med at det er i den filen du kommer til å plassere denne koden) ikke includer seg selv.

 

Noen muligheter til forbedring finnes det da:

Du bruker if (!isset($id)) og if ($id == ""). For det første så burde det stå if(empty($id)) og ikke == "", og for det andre så kan du slå sammen disse to. I steden for if(!isset($is)) så kan du bruke if(empty($id)) og kutte ut den senere.

 

I motsettning til tidligere forslag jeg har sett her så har du fått med deg det viktige - og du har i tillegg løst det på en enkel måte. For programmerere så er det viktig "to keep it short and simple" - på den måten er det lettere å finne sikkerhets hull og scriptene blir raskere. Det er ofte forskjellen på en nybegynner og en erfaren programmerer.

 

Videre kan det diskuteres om det skal være mulig å include filer i andre mapper slik det vil være her. Dersom du ikke har andre mapper med viktige filer så er ikke det noe problem, selv om det hadde vært kjekt om du sjekket at $id kun inneholdt tall og/eller bokstaver og ikke .. eller /

Lenke til kommentar
No har eg oppdatert slik at $id ikkje tillatar . eller /

Ikke gjør det på den måten, sjekke heller som jeg skrev over at $id kun inneholder tall og bokstaver (eventuelt bare bokstaver). Det er ikke noe poeng at du skal søke gjennom $id to ganger.

 

Eventuelt så burde du søke etter begge delene i samme søket.

 

Er det eigentleg vits å ha med den isset-funksjonen? Har jo med if ($id == "").

Les det jeg skrev over.

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

Takker for svar!

 

Eg oppdaga noko rart... Når eg bruker "eregi" til å ikkje tillate . så kjem får alle sidene $error. Kvifor det? Om $id=main så er det jo ikkje . i main...

 

Uansett held det vel med eregi på / sidan ein ikkje får noko ut av . aleine.

Lenke til kommentar
No har eg oppdatert slik at $id ikkje tillatar . eller /

Ikke gjør det på den måten, sjekke heller som jeg skrev over at $id kun inneholder tall og bokstaver (eventuelt bare bokstaver). Det er ikke noe poeng at du skal søke gjennom $id to ganger.

 

Eventuelt så burde du søke etter begge delene i samme søket.

 

Er det eigentleg vits å ha med den isset-funksjonen? Har jo med if ($id == "").

Les det jeg skrev over.

Smart. Eg vil gjerne at $id kun skal innehalde bokstavar. Korleis gjer eg det?

Lenke til kommentar
No treng eg vel ikkje den +$'en der.

Du vet hva + og $ betyr?

^ betyr at den må starte med

$ betyr at den må slutte med

Hvis du bruker ^$ så betyr det at det ikke kan stå noe annet enn det du definerer. Hvis du kun bruker ^ så betyr det at den kun må begynner med. Da har du problemet at da kan den gå til undermapper.

 

+ betyr flere tegn. [a-z] betyr en bokstav mellom a og z. [a-z]+ betyr en eller flere boktaver mellom a og z.

 

Er det vits med unset?
Nope, ikke dersom du ikke bruker disse variablene senere i et annet script innenfor samme side.

 

Edit:

elseif (!eregi("^[a-z]", $id))

{

echo $error;

}

elseif ($id == "index")

{

echo $error;

 

Disse vil begge echo $error, så da kan du slå de sammen:

elseif (!eregi("^[a-z]", $id) or $id == "index")

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

har dette jeg, er kanskje veldig enkelt, og minimal sikkerhet.

 

$filnavn = $_GET['s'];
if (!$filnavn) {
$filnavn = 'main';
}
$filendelse = '.php';

if (!eregi("^((.*)/)", $filnavn)) {
include $filnavn . $filendelse;
}
else {
include "404.php";
}

 

tilpasset begge:

 

$id = $_GET["s"];

if (empty($id))
{
include("main.php");
}
elseif (!eregi("^[a-z]+$", $id) or $id == "index")
{
include "404.php";
}
elseif (file_exists($id. ".php"))
{
include($id. ".php");
}
else
{
include "404.php";
}

Endret av phun-ky
Lenke til kommentar

hmm kanskje bittelitt of-topic men jeg lager en side nå i øyeblikket og lurer på deres synspunkt ang. sikkerhet.

 

I index.php defineres "godtainkludering" til "ja" (første linje) og under den inkluderes en fil som har alt med mysql å gjøre. (i alle filer til siden bortsett fra index.php er det en if setning som sjekker at "godtainkludering er satt til ja ellers die("feil");

 

midt i index.php har jeg en fil som heter innhold.php (inkludert) og den sjekker $_GET['side'] mot en mysql database og his den finner en rad hvor getnavn == $_GET['side'] så inkluder denne filen (filbane og alt ligger i mysql database)

 

det jeg da forhindrer er at folk kan åpne hvilken som helst phpfil, alle filer må bli inkludert via index.php pga defineringen og siden det bare er innhold.php som inkluderer og den inkludere bare det som er i databasen vil dette gjøre alt mye sikrere.

 

Er dette en sikker løsning?

Lenke til kommentar

WaBBiT:

I et par løsninger jeg har skrevet så har jeg brukt samme teknikk hver gang. Jeg plasserer alle filene i en egen mappe, f.eks. "includefiles". Denne kan man beskytte med f.eks. htaccess dersom man ikke vil at noen skal ha tingang til filene utenom et script.

 

$_GET['side'] er f.eks. variabelen som definerer en side. Før jeg henter siden så sjekker jeg at den variabelen kun inneholder bokstavene a-z. Etter dette så sjekker jeg at filen eksisterer - gjør den det så includer jeg den.

 

På den måten så er det ikke mulig å include andre sider enn de i mappen.

 

Dette burde holde lenge for de fleste. Å blande inn MySQL ol. er mye mer jobb enn det er verdt.

Lenke til kommentar

tja, men det får så bare være :) det blir bittelitt sikrere når en admin/jeg må legge til siden i databasen.... og din måte så kan andre script inkludere sidene dine :) mens i min så må det være definert noe ellers dør jo scriptet :D jj ikke at andre har tilgang til min server men :p

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...