mysql_real_escape_string
(PHP 4 >= 4.3.0, PHP 5, PECL mysql:1.0)
mysql_real_escape_string — Levédi egy stringben a speciális karaktereket egy SQL lekérdezés számára
LeÃrás
Levédi a speciális karaktereket az unescaped_string -ben, figyelembe véve az aktuális kapcsolat karakterkészletét. Tehát biztonságos, ha mysql_query()-n belül használod. Ha bináris adatot akarsz beszúrni, akkor ezt a függvényt kell használnod.
A mysql_real_escape_string() a MySQL könyvtár mysql_real_escape_string függvényét hÃvja meg, amely visszaperjeleket illeszt a következÅ‘ karakterek elé: \x00, \n, \r, \, ', " és \x1a.
Ezt a függvényt mindig használhatod (néhány kivétellel) arra, hogy az adatokat biztonságossá tedd beszúrás előtt.
Paraméterek
- unescaped_string
- 
      A string, amelyben le kell védeni a karaktereket. 
- link_identifier
- 
A MySQL kapcsolat. Ha a kapcsolatazonosÃtó nincs megadva, akkor az utólsó mysql_connect()-el megnyitott kapcsolatot használja. Ha nem talál semmilyen kapcsolatot, megpróbál létrehozni egyet úgy, mintha a mysql_connect() paraméterek nélkül lett volna meghÃvva. Ha esetleg semmilyen kapcsolatot nem talál és nem is sikerül létrehoznia, akkor egy E_WARNING szintű figyelmeztetés generálódik. 
Visszatérési értékek
A levédett stringet adja vissza, hiba esetén pedig FALSE-ot.
Példák
Example#1 Egyszerű példa a mysql_real_escape_string() használatára
<?php
// Kapcsolódás
$kapcsolat = mysql_connect('mysql_host', 'mysql_felhasznalo', 'mysql_jelszo')
    OR die(mysql_error());
// Lekérdezés
$keres = sprintf("SELECT * FROM felhasznalok WHERE felhasznalo='%s' AND jelszo='%s'",
            mysql_real_escape_string($felhasznalo),
            mysql_real_escape_string($jelszo));
?>
Example#2 Példa SQL beoltásos támadásra
<?php
// Egy kérés, amely megvizsgálja, hogy van-e megfelelÅ‘ felhasználó
$keres = "SELECT * FROM felhasznalos WHERE felhasznalo='{$_POST['felhasznalo']}' AND jelszo='{$_POST['jelszo']}'";
mysql_query($keres);
// Nem vizsgáltuk meg a $_POST['jelszo'] változót, ami bármi lehet, amit csak a felhasználó akar! Például:
$_POST['felhasznalo'] = 'aidan';
$_POST['jelszo'] = "' OR ''='";
// Ez azt jelenti, hogy a MySQL-nek küldött kérés a következÅ‘:
echo $keres;
?>
A MySQL-nek küldött kérés
SELECT * FROM felhasznalos WHERE felhasznalo='aidan' AND password='' OR ''=''
Ez megengedné bárkinek, hogy érvényes jelszó nélkül belépjen.
Example#3 Lekérdezés helyes elÅ‘készÃtése
A mysql_real_escape_string() minden változóra való alkalmazása megelÅ‘zi a fenti problémát. A következÅ‘ példa bemutatja adatbázis-lekérdezések "jó szokás" szerinti elvégzését, függetlenül a Magic Quotes beállÃtástól.
<?php
if (isset($_POST['product_name']) && isset($_POST['product_description']) && isset($_POST['user_id'])) {
    // Kapcsolódás
    $link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password');
    if(!is_resource($link)) {
        echo "Failed to connect to the server\n";
        // ... naplózd a hibát pontosan
    } else {
        
        // magic_quotes_gpc eredmények megÅ‘rzése a változókon, ha be van kapcsolva
        if(get_magic_quotes_gpc()) {
            $product_name        = stripslashes($_POST['product_name']);
            $product_description = stripslashes($_POST['product_description']);
        } else {
            $product_name        = $_POST['product_name'];
            $product_description = $_POST['product_description'];
        }
        // Biztonságos kérés létrehozása
        $query = sprintf("INSERT INTO products (`name`, `description`, `user_id`) VALUES ('%s', '%s', '%d')",
                    mysql_real_escape_string($product_name, $link),
                    mysql_real_escape_string($product_description, $link),
                    $_POST['user_id']);
        mysql_query($query, $link);
        if (mysql_affected_rows($link) > 0) {
            echo "Product inserted\n";
        }
    }
} else {
    echo "Fill the form properly\n";
}
?>
A kérés mostmár helyesen fog végrehajtódni, az SQL beszúrásos támadás nem fog működni.
Megjegyzések
Note: A mysql_real_escape_string() használata előtt egy MySQL kapcsolat szükséges, egyébként egy E_WARNING szintű hiba keletkezik és a visszatérési érték FALSE lesz. Ha a link_identifier paraméter nincs definiálva, akkor a legutóbbi MySQL kapcsolatot fogja használni.
Note: Ha a magic_quotes_gpc be van állÃtva, és a felhasználótól érkezÅ‘ adatokkal dolgozol, elÅ‘bb a stripslashes() függvényt kell meghÃvnod az adatokra. Ha már levédett adatra hÃvod meg ezt a függvényt, a levédett adat újból levédésre kerül.
Note: Ha az adatokat nem véded le ezzel a függvénnyel, az adatbázis-kérés nyitva áll az SQL beoltásos támadásoknak.
Note: A mysql_real_escape_string() nem védi le a % és a _ karaktert. Ezek a MySQL-ben joker karakterek, amikor a LIKE, GRANT vagy REVOKE-ban szerepelnek.
Lásd még
- mysql_client_encoding()
- addslashes()
- stripslashes()
- The magic_quotes_gpc directive
- The magic_quotes_runtime directive