Sikre mod SQL injection

Tags:    php mysqli

<< < 12 > >>
Hvordan sikre jeg mod injection ?

Min kode er sådan her.
Fold kodeboks ind/udPHP kode 




Indlæg senest redigeret d. 31.01.2013 23:06 af Bruger #13010
11 svar postet i denne tråd vises herunder
0 indlæg har modtaget i alt -2 karma
Sorter efter stemmer Sorter efter dato
Kommer an på hvor $tablenavn kommer fra. Hvis det er bruger input så kan der stadig udføres injection. Men ellers ser det rigtigt ud.



Indlæg senest redigeret d. 31.01.2013 23:07 af Bruger #14645
$tablenavn sætter jeg kun selv.

Jeg har kørt et program der hedder Acunetix som kan teste sådan noget også lader det til der er sket injection med den kode ovenfor.

Jeg har denne kode som hente data og viser på hjemmesiden.
Fold kodeboks ind/udPHP kode 


Når jeg går ind på siden kommer der en Javascript alter() boks hvor der står 953153 fordi denne kode står mellem td og /td og det gør den ved $url.
Fold kodeboks ind/udKode 


Det hedder måske ikke injection ?

Det skal kun være tilladt med en URL i $url som fåes gennem GET.
Så det skal ikke være tilladt med HTML tags og javascript kode osv.

Hvordan gør jeg det på den bedste måde ?

Jeg kan gøre sådan her men er det mening man skal gøre sådan ?
Det vel bedre at sikre sig det ikke kommer ind til at starte med.
Fold kodeboks ind/udPHP kode 




Indlæg senest redigeret d. 01.02.2013 00:54 af Bruger #13010
Det er ikke injection, men manglende validering.

Hvis du beder brugeren om en url, så skal du sikre dig at det er en url.



Det du ser der kaldes cross site scripting. Brugerleveret input, som indeholder JavaScript og HTML tags bliver skrevet direkte tilbage uden filtrering.

Du kan bruge strip_tags() til at fjerne al HTML fra en streng, eller htmlspecialchars() til at konvertere alle '<', '>', '&', '"' og "'" tegn til '>', '<', '&', '"' og '''.

Hvis det er meningen, at man skal kunne skrive HTML, så brug HTMLPurifier: http://htmlpurifier.org/
Den filtrerer al JavaScript væk.



Hvis jeg nu modtager en string i queryen som for eksempel ;
"fil.php?url=/mappe/filnavn.php"

Også vil jeg gerne teste at "/mappe/filnavn.php" nu også er en sti og ikke noget javscript kode osv hvordan gør jeg det ?

Jeg har kigget på filter_var($url, FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED) men der skal stå "http://..." foran og det vil jeg helst ikke have.





Som @Robert Larsen siger, så er det ikke SQL injection, men XSS (cross site scripting), det vil sige, at dine brugere (hackere eller almindelige brugere) kan indsætte javascript på din side og dermed udføre ondsindet kode.

Derfor skal du altid validere / filtrere alt input fra brugere serverside og det kan faktisk være meget svært, da der findes mange måder, at skjule et scripttag på. Eller det behøver ikke engang være et scripttag, for nedestående er f.eks. også valid kode:
Fold kodeboks ind/udHTML kode 




Ok men nu er det bare en sti der skal være.
Så hvordan tester jeg at det er en sti ?

Altså værdien skal være : /mappe/filnavn.php
I den stil.



med regex



Er der ikke en funktion i PHP som kan sige "er det her en sti" ?
ligesom is_path("/mappe/filnavn.php") eller noget i den stil.



Der er kun få tegn som ikke er lovlige i en sti så
Fold kodeboks ind/udKode 

...kunne meget vel være en valid sti...men det ved du nok mere om. Hvis du har en konvention om, at kun alfanumerics, underscore og punktum er tilladt i filnavne, så laver du bare et regex, som tjekker det. Hvis filen også skal eksistere, så kan du tjekke det, og droppe ud, hvis den ikke eksisterer.



<< < 12 > >>
t