PHP kézikönyv
Előző |  | Következő

# mysql_real_escape_string

(PHP 4 >= 4.3.0, PHP 5)

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

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)); ?>`

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ések

> Megjegyzés: 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.

> 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 levédett adatra hívod meg ezt a függvényt, a levédett adat újból levédésre kerül.

> Megjegyzés: 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.

> Megjegyzés: 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

Előző | Tartalom | Következő
mysql_query | Fel | mysql_result