Mysql injection sikret?

Tags:    mysql injections sikret

Hej folkens, vil bare lige høre omkring mysql injection, om min fil er sikret nok imod mysql injection

Fold kodeboks ind/udPHP kode 





Vil det være sikret nok, og hvis jeg så skal lave en fil som ret_profil, hvor man skal gemme filer, vil det samme så virke?



5 svar postet i denne tråd vises herunder
2 indlæg har modtaget i alt 8 karma
Sorter efter stemmer Sorter efter dato
Prepared statements kan sikre dig mod nogen problemer ja. MySQLi eller PDO skal altid bruges fremfor den gamle mysql-extension. Nu har Kenneth anbefalet MySQLi - men min personlige favorit er PDO. Kig på dem begge - de er sådan set lige gode (i hvert fald hvis din db er MySQL)

Men man skal ikke bare bruge prepared-statements og glemme alt andet. For eksempel, så er det jo lige så meget en fejl, hvis der står abc i din id-get variabel, som hvis der stod 1\' OR blabla.

Hver gang jeg hiver et id fra en URI som jeg vil trække data fra en db med, så ryger det igennem en ctype_digit ( http://php.net/ctype_digit ).

Det handler om at sikre sig, at det data du modtager fra brugeren også har den form og struktur som du forventer.

Udover ctype_digit og de andre ctype_ funktioner kan det anbefales at tage et kig på filter_var og filter_input funktionerne, samt de forskellige filtre til disse. Mere om dem kan findes i manualen på php.net - meget bedre forklaret end jeg kan håbe på at gøre her :)



er du sikker på at dit username er af typen integer ??
jeg havde forvendtet noget ala dette, dvs som string
Fold kodeboks ind/udKode 




Så længe du bruger det "gamle" MySQL API, så er det du har lavet med mysql_real_escape_string, blot en lappeløsning. Jeg har selv anvendt MySQL API på min sider, men er ved at lave det hele om til at bruge et nyere API, som benytter MySQLi med prepared statements. Det skulle, efter hvad jeg har læst være bedre til at forhindre SQL-injection, samt øge den generelle sikkerhed omkring udveksling af information fra databasen.
Et link til en basic guide i MySQLi kan findes her. Den er super simpel og nem at komme igennem.
Men hvis du blot vil forhindre at dem der bare skal "lege" med at komme ind via SQL-injection, så er det du har nok.



har nu forsøgt mig lidt frem med Mysqli



Fold kodeboks ind/udPHP kode 


Får en fejl på linje 16
altså
$stmt->bind_result($name, $age);

Men er os itvivl omkring WHERE `username` > ?')) {
Hvorfor er det den laver > ? i slutningen



Større og mindre end tegn er selvfølgelig kun til numeriske datatyper. Hvis din username kolonne er en streng, kan du ikke bruge dem.

Strukturen på din query, og din beskrivelse af din situation, indikerer at du leder efter en specifik række og ikke alle usernames med en værdi over x.

Spørgsmålstegnet indikerer en ubekendt. Den som du binder med metoden bind_param. I bind_param indikerer du forøvrigt at username er et heltal. Hvis du skal specificere en streng som datatype, skal du skrive s istedet for i. s for string, i for integer.

bind_result fejlen kan jeg ikke kommentere dybere på - jeg kender ikke MySQLi i detaljer - men min intuition siger mig, at det er fordi du får en fejl i dit resultat - altså en skidt query...



Indlæg senest redigeret d. 29.08.2012 20:02 af Bruger #17015
t