sql >> Database teknologi >  >> RDS >> Mysql

PHP / MySQLi:Sådan forhindrer du SQL-injektion på INSERT (koden fungerer delvist)

I Ny PHP-kode snippet, er du stadig sårbar over for injektioner.
Du bruger en forberedt erklæring i indstiksdelen, men du bruger faktisk ikke præparatets styrker korrekt.

Når du opretter en forberedt erklæring, opretter du en forespørgsel, hvor du tilføjer pladsholdere i stedet for de rå værdier:

$stmt = $conn->prepare("INSERT INTO Users (email, pw) VALUES (?, ?)");

Spørgsmålstegnet er pladsholderne og erstattes senere ved at bruge bind_param metode:

$stmt->bind_param('ss', $email, $pw);

ss en del af bindekaldet fortæller mysql db, at dens to strenge, der sendes til databasen (s for string , i for int osv.).
Du binder en param ($name ), men den har ingen pladsholder eller nogen form for reference i forespørgslen..?

Din select-erklæring er på den anden side stadig usikker og åben for sårbarheder.
Jeg ville nok bruge en forberedt erklæring der til, ligesom med indsættelsesdelen.

Du vil altid sikre dig, at input fra brugeren er "sikkert" for databasen, hvis du sammensætter en forespørgselsstreng og tilføjer brugerinput til den, vil databasen ikke undslippe strengene, den vil bare køre den.

Brug kun standard query metodekald, når du selv skriver hele forespørgslen, uden nogen input-parametre, og især ingen input-parametre, som brugeren har bestået!



  1. Fejl sql:Konverteringen af ​​en varchar-datatype til en datetime-datatype resulterede i en værdi uden for området

  2. MySQL Opret visning, Erstat visning og slip visningserklæringer med eksempler

  3. Udfør sp_executeSql for select...into #table, men kan ikke udvælge Temp-tabeldata

  4. Hvordan beregner man multiplikationsværdi inde i while-løkken i PHP?