Šajā vietnē wikiHow tiek mācīts, kā novērst SQL ievadīšanu, izmantojot PHP sagatavotos paziņojumus. SQL injekcija mūsdienās ir viena no visbiežāk sastopamajām tīmekļa lietojumprogrammu ievainojamībām. Sagatavotajos pārskatos tiek izmantoti saistītie parametri un tie nekombinē mainīgos ar SQL virknēm, tādējādi uzbrucējam nav iespējams modificēt SQL priekšrakstu.
Sagatavotie pārskati apvieno mainīgo ar apkopoto SQL paziņojumu, lai SQL un mainīgie tiktu nosūtīti atsevišķi. Pēc tam mainīgie tiek interpretēti kā vienkāršas virknes, nevis daļa no SQL priekšraksta. Izmantojot tālāk norādīto darbību metodes, jums nebūs jāizmanto citas SQL injekcijas filtrēšanas metodes, piemēram, mysql_real_escape_string ().
Soļi
1. daļa no 2: Izpratne par SQL injekciju
1. darbība. SQL injekcija ir ievainojamības veids lietojumprogrammās, kas izmanto SQL datu bāzi
Neaizsargātība rodas, kad lietotāja ievade tiek izmantota SQL paziņojumā:
$ name = $ _GET ['lietotājvārds']; $ query = "SELECT paroli no tbl_user WHERE name = '$ name'";
2. darbība. Lietotāja ievadītā vērtība URL mainīgajā lietotājvārdā tiks piešķirta mainīgajam $ name
Pēc tam tas tiek ievietots tieši SQL paziņojumā, ļaujot lietotājam rediģēt SQL paziņojumu.
$ name = "admin" VAI 1 = 1 - "; $ query = "SELECT paroli no tbl_user WHERE name = '$ name'";
Solis 3. Pēc tam SQL datu bāze saņems SQL paziņojumu šādi:
ATLASIET paroli no tbl_users WHERE name = 'admin' OR 1 = 1 - '
-
Tas ir derīgs SQL, bet tā vietā, lai atgrieztu lietotājam vienu paroli, paziņojums atgriezīs visas tabulas tbl_user paroles. Tas nav kaut kas, ko vēlaties savās tīmekļa lietojumprogrammās.
2. daļa no 2: MySQLi izmantošana sagatavotu pārskatu izveidei
1. darbība. Izveidojiet vaicājumu mySQLi SELECT
Izmantojiet zemāk esošo kodu, lai ATLASĪTU datus no tabulas, izmantojot mySQLi sagatavotos paziņojumus.
$ name = $ _GET ['lietotājvārds']; if ($ stmt = $ mysqli-> sagatavot ("SELECT password FROM tbl_users WHERE name =?")) {// Piesaistiet mainīgo parametram kā virkni. $ stmt-> bind_param ("s", $ nosaukums); // Izpildīt paziņojumu. $ stmt-> izpildīt (); // Iegūstiet mainīgos no vaicājuma. $ stmt-> bind_result ($ caurlaide); // Iegūstiet datus. $ stmt-> atnest (); // Parādīt datus. printf ("Lietotāja %s parole ir %s / n", $ name, $ pass); // Aizveriet sagatavoto paziņojumu. $ stmt-> aizvērt (); }
Piezīme. Mainīgais $ mysqli ir mySQLi savienojuma objekts
2. darbība. Izveidojiet vaicājumu mySQLi INSERT
Izmantojiet zemāk esošo kodu, lai ievietotu datus tabulā, izmantojot mySQLi sagatavotos paziņojumus.
$ name = $ _GET ['lietotājvārds']; $ parole = $ _GET ['parole']; if ($ stmt = $ mysqli-> sagatavot ("INSERT INTO tbl_users (vārds, parole) VĒRTĪBAS (?,?)")) {// Saistīt mainīgos ar parametru kā virknes. $ stmt-> bind_param ("ss", $ nosaukums, $ parole); // Izpildīt paziņojumu. $ stmt-> izpildīt (); // Aizveriet sagatavoto paziņojumu. $ stmt-> aizvērt (); }
Piezīme. Mainīgais $ mysqli ir mySQLi savienojuma objekts
3. solis. Izveidojiet vaicājumu mySQLi UPDATE
Izmantojiet zemāk esošo kodu, lai atjauninātu datus tabulā, izmantojot mySQLi sagatavotos pārskatus.
$ name = $ _GET ['lietotājvārds']; $ parole = $ _GET ['parole']; if ($ stmt = $ mysqli-> sagatavot ("UPDATE tbl_users SET password =? WHERE name =?")) {// Piesaistiet mainīgos parametram kā virknes. $ stmt-> bind_param ("ss", $ parole, $ nosaukums); // Izpildīt paziņojumu. $ stmt-> izpildīt (); // Aizveriet sagatavoto paziņojumu. $ stmt-> aizvērt (); }
Piezīme. Mainīgais $ mysqli ir mySQLi savienojuma objekts
Solis 4. Izveidojiet vaicājumu mySQLi DELETE
Zemāk esošais skripts ir veids, kā izdzēst datus no tabulas, izmantojot mySQLi sagatavotos paziņojumus.
$ name = $ _GET ['lietotājvārds']; $ parole = $ _GET ['parole']; if ($ stmt = $ mysqli-> sagatavot ("DELETE FROM tbl_users WHERE name =?")) {// Piesaistiet mainīgo parametram kā virkni. $ stmt-> bind_param ("s", $ nosaukums); // Izpildīt paziņojumu. $ stmt-> izpildīt (); // Aizveriet sagatavoto paziņojumu. $ stmt-> aizvērt (); }