MySQL og SQL Injection

Hvis du tar brukerundersøkelser gjennom en nettside, og sette det inn i en MySQL database, er det en sjanse for at du har igjen selv vidåpne for et sikkerhetsproblem kjent som SQL Injection. Denne leksjonen vil lære deg hvordan du kan bidra til å forhindre at dette skjer, og hjelpe deg å sikre dine skript og MySQL uttalelser.

Injeksjon vanligvis oppstår når du spør en bruker for innspill, som deres navn og i stedet for et navn de gir deg en MySQL erklæring om at du vil uvitende kjøre på databasen

Aldri klareringsbruker levert data, bearbeide disse dataene kun etter validering.; Som regel gjøres dette ved mønstergjenkjenning. I eksempelet nedenfor, er brukernavnet begrenset til alfanumeriske tegn pluss understreking og til en lengde på mellom 8 og 20 tegn -. Endre disse reglene etter behov
if (preg_match ("/^ \\ w {8,20} $ /" , $ _GET ['brukernavn'], $ kamper)) {$ resultat = mysql_query ("SELECT * FROM brukere WHERE brukernavn = $ kampene [0]");} else {echo "brukernavn ikke akseptert";}

Å demonstrere problemet, bør du vurdere dette utdraget:
//ment innspill $ name = "Qadir '; DELETE FROM brukere;"; mysql_query ("SELECT * FROM brukere WHERE name =' {$ name}");

funksjonen samtalen er ment for å hente en post fra brukere bordet, hvor navnet kolonnen samsvarer med navnet spesifisert av brukeren. Under normale omstendigheter ville $ name bare inneholde alfanumeriske tegn og kanskje mellomrom, for eksempel streng Ilia. Men her, ved å legge en helt ny forespørsel til $ navn, blir kallet til databasen til katastrofen: det injiserte DELETE spørringen fjerner alle poster fra brukere

Heldigvis, hvis du bruker MySQL, den mysql_query () -funksjonen. tillater ikke spør stabling eller utfører flere spørringer i en enkelt funksjon samtale. Hvis du prøver å stable spørringer, mislykkes samtalen.

Men andre PHP database utvidelser, for eksempel SQLite og PostgreSQL, lykkelig utføre stablet spørringer, gjennomføre alle de spørsmål som er gitt i en streng og skape et alvorlig sikkerhetsproblem .

Hindre SQL Injection:

Du kan håndtere alle escape-tegn smart i skriptspråk som Perl og PHP. MySQL forlengelse for PHP gir funksjonen mysql_real_escape_string () å flykte inn tegn som er spesielle for MySQL
if (get_magic_quotes_gpc ()) {$ name = stripslashes ($ navn);}. $ Name = mysql_real_escape_string ($ navn); mysql_query ("SELECT * FROM brukere WHERE name = '{$ name}");
lignende dilemma:

For å ta LIKE dilemma, må en tilpasset rømmer mekanisme konvertere brukerlevert% og _ tegn til konstanter. Bruk addcslashes (), en funksjon som lar deg angi en karakter rekke å flykte
$ sub = addcslashes (mysql_real_escape_string («% something_"), "% _");. //$ Sub == \\% noe \\ _mysql_query ("SELECT * FROM meldinger der emnet LIKE '{$ sub}%'");



Previous:
Next Page: