mysql_real_escape_string

(PHP 4 >= 4.3.0, PHP 5)

mysql_real_escape_string --  Feloldja 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] )

unescaped_string

A string, amelyben fel kell oldani a karaktereket

link_identifier (elhagyható)

A mysql kapcsolat erõforrása

Ez a függvény feloldja 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_escape_string függvényét hívja meg, amely visszaperjeleket illeszt a következõ karakterek elé: NULL, \x00, \n, \r, \, ', " és \x1a.

Példa 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));
?>

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.

Megjegyzés: 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 feloldott adatra hívod meg ezt a függvényt, a feloldott adat újból feloldásra kerül.

Ha az adatokat nem oldod fel ezzel a függvénnyel, az adatbázis-kérés nyitva áll az SQL beoltásos támadásnak.

Példa 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 name='aidan' AND jelszo='' OR ''=''

Ez megengedné bárkinek, hogy érvényes jelszó nélkül belépjen.

Példa 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
// Változó idézõjelezése, hogy biztonságos legyen
function idezojelezes($ertek)
{
    
// Stripslashes
    
if (get_magic_quotes_gpc()) {
        
$ertek = stripslashes($ertek);
    }
    
// Idézõjelezés, ha nem egész érték
    
if (!is_numeric($ertek)) {
        
$ertek = "'" . mysql_real_escape_string($ertek) . "'";
    }
    return
$ertek;
}

// Kapcsolódás
$kapcsolat = mysql_connect('localhost', 'mysql_felhasznalo', 'mysql_jelszo')
    OR die(
mysql_error());

// Biztonságos kérés létrehozása
$keres = sprintf("SELECT * FROM felhasznalok WHERE felhasznalo=%s AND jelszo=%s",
            
idezojelezes($_POST['felhasznalo']),
            
idezojelezes($_POST['jelszo']));

mysql_query($keres);
?>

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és: A mysql_real_escape_string() nem oldja fel a % és a _ karaktert. Ezek a MySQL-ben joker karakterek, amikor a LIKE, GRANT vagy REVOKE-ban szerepelnek.

Lásd még a mysql_escape_string(), mysql_client_encoding() és stripslashes() függvényeket valamint a magic_quotes_gpc, és a magic_quotes_runtime direcktívát.