Ez a wikiHow megtanítja, hogyan lehet megakadályozni az SQL -befecskendezést a PHP -ben lévő Kész kimutatások használatával. Az SQL -befecskendezés napjaink egyik leggyakoribb biztonsági rése a webes alkalmazásokban. Az előkészített utasítások kötött paramétereket használnak, és nem kombinálják a változókat az SQL karakterláncokkal, ami lehetetlenné teszi a támadó számára az SQL utasítás módosítását.
Az elkészített utasítások kombinálják a változót az összeállított SQL utasítással, így az SQL és a változók külön kerülnek elküldésre. A változókat ezután puszta karakterláncként értelmezik, és nem az SQL utasítás részét. Az alábbi lépésekben leírt módszerek használatával nem kell más SQL befecskendezési szűrési technikákat használni, mint például a mysql_real_escape_string ().
Lépések
Rész 1 /2: Az SQL befecskendezés értelmezése
1. lépés: Az SQL -befecskendezés az SQL -adatbázist használó alkalmazások biztonsági rése
A biztonsági rés akkor jelentkezik, amikor egy felhasználói bevitelt használnak egy SQL utasításban:
$ name = $ _GET ['felhasználónév']; $ query = "SELECT password from FROM tbl_user WHERE name = '$ name'";
2. lépés. A felhasználó által a felhasználónév URL -változóba beírt értéket hozzárendeli a $ name változóhoz
Ezután közvetlenül az SQL utasításba kerül, lehetővé téve a felhasználó számára az SQL utasítás szerkesztését.
$ name = "admin" VAGY 1 = 1 - "; $ query = "SELECT password from FROM tbl_user WHERE name = '$ name'";
3. lépés. Az SQL -adatbázis a következőképpen fogadja az SQL -utasítást:
Jelszó kiválasztása a tbl_users webhelyről WHERE name = 'admin' VAGY 1 = 1 - '
-
Ez érvényes SQL, de ahelyett, hogy egy jelszót adna vissza a felhasználónak, a utasítás visszaadja a tbl_user táblázat összes jelszavát. Ez nem az, amit szeretne a webes alkalmazásokban.
2. rész a 2 -ből: A MySQLi használata kész kimutatások létrehozásához
1. lépés: Hozza létre a mySQLi SELECT lekérdezést
Az alábbi kóddal válassza ki az adatokat a táblázatból a mySQLi Prepared Statements segítségével.
$ name = $ _GET ['felhasználónév']; if ($ stmt = $ mysqli-> előkészíteni ("SELECT password from FROM tbl_users WHERE name =?")) {// Egy változót karakterláncként köt a paraméterhez. $ stmt-> bind_param ("s", $ név); // Végezze el a nyilatkozatot. $ stmt-> végrehajtás (); // A változók lekérése a lekérdezésből. $ stmt-> bind_result ($ pass); // Az adatok lekérése. $ stmt-> fetch (); // Az adatok megjelenítése. printf (" %s felhasználó jelszava %s / n", $ name, $ pass); // Zárja be az elkészített nyilatkozatot. $ stmt-> bezár (); }
Megjegyzés: A $ mysqli változó a mySQLi Connection Object
2. lépés. Hozza létre a mySQLi INSERT lekérdezést
Az alábbi kóddal illessze be az adatokat táblázatba a mySQLi Prepared Statements segítségével.
$ name = $ _GET ['felhasználónév']; $ password = $ _GET ['jelszó']; if ($ stmt = $ mysqli-> előkészít ("INSERT INTO tbl_users (név, jelszó) VALUES (?,?)")) {// A változókat karakterláncként kösse a paraméterhez. $ stmt-> bind_param ("ss", $ név, $ jelszó); // Végezze el a nyilatkozatot. $ stmt-> végrehajtás (); // Zárja be az elkészített nyilatkozatot. $ stmt-> bezár (); }
Megjegyzés: A $ mysqli változó a mySQLi Connection Object
3. lépés. Hozza létre a mySQLi UPDATE lekérdezést
Használja az alábbi kódot a táblázat adatainak frissítéséhez a mySQLi Prepared Statements használatával.
$ name = $ _GET ['felhasználónév']; $ password = $ _GET ['jelszó']; if ($ stmt = $ mysqli-> előkészít ("UPDATE tbl_users SET password =? WHERE name =?")) {// A változókat karakterláncként kösse össze a paraméterrel. $ stmt-> bind_param ("ss", $ jelszó, $ név); // Végezze el a nyilatkozatot. $ stmt-> végrehajtás (); // Zárja be az elkészített nyilatkozatot. $ stmt-> bezár (); }
Megjegyzés: A $ mysqli változó a mySQLi Connection Object
4. lépés. Hozza létre a mySQLi DELETE lekérdezést
Az alábbi parancsfájl bemutatja, hogyan lehet adatokat törölni egy táblázatból a mySQLi Prepared Statements használatával.
$ name = $ _GET ['felhasználónév']; $ password = $ _GET ['jelszó']; if ($ stmt = $ mysqli-> előkészítés ("DELETE FROM tbl_users WHERE name =?")) {// A változót karakterláncként kösse össze a paraméterrel. $ stmt-> bind_param ("s", $ név); // Végezze el a nyilatkozatot. $ stmt-> végrehajtás (); // Zárja be az elkészített nyilatkozatot. $ stmt-> bezár (); }