Kuidas vältida SQL-i sisestamist PHP-s

See Selgitatud õpetab, kuidas vältida SQL-i sisestamist PHP-s ettevalmistatud avalduste abil. SQL-i süstimine on tänapäeval üks levinumaid turvaauke veebirakendustes. Ettevalmistatud avaldused kasutavad seotud parameetreid ega kombineeri muutujaid SQL-i stringidega, muutes ründajal võimatuks SQL-lauset muuta. Ettevalmistatud avaldused ühendavad muutuja koostatud SQL-lausega, nii et SQL ja muutujad saadetakse eraldi. Seejärel tõlgendatakse muutujaid pelgalt stringidena, mitte SQL-lause osana. Kasutades alltoodud toimingutes kirjeldatud meetodeid, ei pea te kasutama muid SQL-i süstimise filtreerimismeetodeid, näiteks mysql_real_escape_string().

1
SQL-i süstimine on teatud tüüpi haavatavus rakendustes, mis kasutavad SQL-andmebaasi. Haavatavus tekib, kui SQL-lauses kasutatakse kasutaja sisendit:$name = $_GET[‘kasutajanimi’];$query = “VALI parool FROM tbl_user WHERE nimi = ‘$nimi’ “;

2
Väärtus, mille kasutaja sisestab URL-i muutujasse username, määratakse muutujale $name. Seejärel asetatakse see otse SQL-lausesse, võimaldades kasutajal SQL-lauset redigeerida. $name = “admin’ VÕI 1=1 — “;$query = “VALI parool FROM tbl_user WHERE name = ‘$nimi’ “;

3
Seejärel saab SQL-andmebaas SQL-lause järgmiselt: SELECT parool FROM tbl_users WHERE nimi = ‘admin’ VÕI 1=1 — ‘See on kehtiv SQL, kuid selle asemel, et tagastada kasutajale üks parool, tagastab avaldus kõik paroolid tabelis tbl_user. Seda ei soovi oma veebirakendustes.

4
Looge mySQLi SELECT päring. Kasutage allolevat koodi andmete valimiseks tabelist, kasutades mySQLi ettevalmistatud avaldusi.$name = $_GET[‘kasutajanimi’];if ($stmt = $mysqli->prepare(“VALI parool FROM tbl_users WHERE nimi=?”)) { // Muutuja sidumine parameetriga stringina. $stmt->bind_param(“s”, $nimi); // Täitke avaldus. $stmt->käivita(); // Hangi muutujad päringust. $stmt->bind_result($pass); // Andmete toomine. $stmt->fetch(); // Kuva andmed. printf(“Kasutaja %s parool on %sn”, $nimi, $pass); // Sulgege koostatud avaldus. $stmt->close();}Märkus. Muutuja $mysqli on mySQLi ühenduse objekt.

5
Looge mySQLi INSERT päring. Kasutage allolevat koodi andmete SISESTAMISEKS tabelisse, kasutades mySQLi ettevalmistatud avaldusi.$nimi = $_GET[‘kasutajanimi’];$password = $_GET[‘parool’];if ($stmt = $mysqli->prepare(“INSERT INTO tbl_users (nimi, parool) VÄÄRTUSED (?, ?)”)) { // Seo muutujad parameetriga stringidena. $stmt->bind_param(“ss”, $nimi, $parool); // Täitke avaldus. $stmt->käivita(); // Sulgege koostatud avaldus. $stmt->close();}Märkus. Muutuja $mysqli on mySQLi ühenduse objekt.

6
Looge päring mySQLi UPDATE. Kasutage allolevat koodi andmete VÄRSKENDAMISEKS tabelis, kasutades mySQLi ettevalmistatud avaldusi.$name = $_GET[‘kasutajanimi’];$password = $_GET[‘parool’];if ($stmt = $mysqli->prepare(“UPDATE tbl_users SET parool = ? WHERE nimi = ?”)) { // Seo muutujad parameetriga stringidena. $stmt->bind_param(“ss”, $parool, $nimi); // Täitke avaldus. $stmt->käivita(); // Sulgege koostatud avaldus. $stmt->close();}Märkus. Muutuja $mysqli on mySQLi ühenduse objekt.

7
Looge mySQLi DELETE päring. Allolev skript näitab, kuidas kustutada andmeid tabelist, kasutades mySQLi ettevalmistatud avaldusi.$name = $_GET[‘kasutajanimi’];$password = $_GET[‘parool’];if ($stmt = $mysqli->prepare(” DELETE FROM tbl_users WHERE nimi = ?”)) { // Seo muutuja parameetriga stringina. $stmt->bind_param(“s”, $nimi); // Täitke avaldus. $stmt->käivita(); // Sulgege koostatud avaldus. $stmt->close();}Märkus. Muutuja $mysqli on mySQLi ühenduse objekt.