Forum und email

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

string mysql_real_escape_string ( string $unescaped_string [, resource $link_identifier ] )

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.