Spørgsmål vedrørende SQL injection

Tags:    php mysql sikkerhed

Hej.

Jeg har kigget lidt på SQL injections. Mit spørgsmål er, om der ikke skal mere end

Fold kodeboks ind/udPHP kode 


til at beskytte mod SQL injections. Jeg tror nemlig godt, at jeg kan bruge SQL injections på min egen hjemmeside og på den måde komme ind på admin brugeren. Sandsynligvis ikke på hosten, men på det logind system, som jeg har lavet.

På forhånd tak for svaret/svarne :).



Indlæg senest redigeret d. 10.04.2012 16:59 af Bruger #14776
8 svar postet i denne tråd vises herunder
4 indlæg har modtaget i alt 15 karma
Sorter efter stemmer Sorter efter dato
Drop MySQL og brug MySQLi prepared SQL statements. Det er nok den mest sikre vej for at undgå SQLi. Det eller PDO.

http://php.net/manual/en/mysqli.quickstart.prepared-statements.php




Et andet eksempel er at du kan bruge htmlentities, som følgende:


Nej, brug ikke htmlentities() mod SQL injections!

mysql_real_escape_string() er ikke nok i sig selv, det afhænger også af, hvordan din SQL sætning er skruet sammen.

Forestil dig nedenstående scenario:

Fold kodeboks ind/udPHP kode 

$sql2 vinder.

edit: rettet eksemplet, da tidligere eksempel var dbms specifikt. Dette er lidt mere generisk.

En god idé ville være, at læse op på prepared statements.



Indlæg senest redigeret d. 10.04.2012 19:23 af Bruger #955
Ved et login-system kan du sikre imod det data der bliver sendt til SQL-strengen. Et eksempel kunne være:

Fold kodeboks ind/udPHP kode 


På den måde kan du sikre imod basal SQL-injections. Der er utallige metoder du kan gøre dette på.

Et andet eksempel er at du kan bruge htmlentities, som følgende:
Fold kodeboks ind/udPHP kode 




strip_tags() bruges ikke til at beskytte mod SQL injection, men imod cross site scripting, cross site request forgeries, PHP injection og lignende. Læs her: http://php.net/manual/en/function.strip-tags.php

For at beskytte dig imod SQL injection kan du bruge prepared statements KORREKT!!!, eller du kan bruge mysql_real_escape_string() på alle brugerleverede data, som skal indgå i SQL strengen.



Prepared statements og pdo er vejen frem



Prepared statements kan bruges ligeså forkert som hjemmestrikkede SQL strenge. F.eks.:

Fold kodeboks ind/udKode 


Man er nødt til at forstå problemet, før man kan løse det.



Jeg har nemlig set, at man bare kunne skrive:

Fold kodeboks ind/udKode 


Hvis man udfylder den i både password og username, så vil den bare kunne hente den bruger med ID'et 1 samt passwordet og logge ind med det.

Jeg tænkte også lidt over det, da jeg kan huske, at der er mange hjemmesider, som ofte bliver hacket ved hjælp af SQL-injection.

Men man kan altså bruge:
Fold kodeboks ind/udPHP kode 


For at kunne omgå det problem eller hvordan? - Jeg ved ikke helt med MySQLi. Det ser noget uoverskueligt ud... Et andet spørgsmål, kan man bruge det på en server som kun har MySQL installeret?



strip_tags() bruges ikke til at beskytte mod SQL injection, men imod cross site scripting, cross site request forgeries, PHP injection og lignende. Læs her: http://php.net/manual/en/function.strip-tags.php

For at beskytte dig imod SQL injection kan du bruge prepared statements KORREKT!!!, eller du kan bruge mysql_real_escape_string() på alle brugerleverede data, som skal indgå i SQL strengen.


Okay, så bruger jeg nok bare mysql_real_escape_string() på alle brugerleverede data. Jeg synes det der MySQLi ser meget uoverskueligt ud :-P.

Tak for svaret :).



t