(PHP 4 >= 4.3.0, PHP 5)
mysql_real_escape_string — Dodaje znaki unikowe w łańcuchu znaków do użycia w instrukcji SQL
Dodaje znaki unikowe do łańcucha_bez_znaków_unikowych, mając na uwadze aktualnie używany w połączeniu zestaw znaków by tak przygotowanego łańcucha można bezpiecznie użyc w funkcji mysql_query(). Jeśli dopisywane dane mają postać binarną wymagane jest użycie tej funkcji.
mysql_real_escape_string() wywołuje funkcję biblioteki MySQL mysql_real_escape_string, która dodaje lewe ukośniki (backslash) do następujących znaków: \x00, \n, \r, \, ', " and \x1a.
Użycie tej funkcji jest wymagane zawsze (poza kilkoma wyjątkami) przed wysłaniem zapytania do bazy danych aby zabezpieczyć dane.
Łańcuch, do którego zostaną dodane znaki unikowe.
Połączenie MySQL. Jeśli identyfikator połączenia nie zostanie podany, użyte zostanie ostatnie połączenie otwarte przez mysql_connect(). Jeśli połączenie takie nie zostanie znalezione, funkcja spróbuje nawiązać połączenie tak, jakby wywołana została funkcja mysql_connect() bez argumentów. Jeśli żadne połączenie nie zostanie znalezione lub nawiązane, wygenerowany zostanie błąd poziomu E_WARNING.
Zwraca łańcuch ze znakami unikowymi lub FALSE w przypadku błędu.
Przykład #1 Przykład użycia mysql_real_escape_string()
<?php
// Connect
$link = mysql_connect('host', 'uzytkownik', 'haslo')
OR die(mysql_error());
// Zapytanie
$query = sprintf("SELECT * FROM uzytkownicy WHERE uzytkownik='%s' AND haslo='%s'",
mysql_real_escape_string($uzytkownik),
mysql_real_escape_string($haslo));
?>
Przykład #2 Przykład ataku SQL Injection
<?php
// Zapytanie pobierające pasujących użytkowników
$query = "SELECT * FROM uzytkownicy WHERE uzytkownik='{$_POST['nazwa_uzytkownika']}' AND haslo='{$_POST['haslo']}'";
mysql_query($query);
// Nie sprawdziliśmy zmiennej $_POST['haslo'], która może zawierać wszystko czego chciał użytkownik! Na przykład:
$_POST['nazwa_uzytkownika'] = 'aidan';
$_POST['haslo'] = "' OR ''='";
// Oznacza to, że zapytanie ma postać:
echo $query;
?>
Zapytanie wysłane do bazy danych:
SELECT * FROM users WHERE user='aidan' AND password='' OR ''=''
Zapytanie to pozwala zalogować się każdemu bez znajomości poprawnego hasła.
Informacja:
Przed użyciem mysql_real_escape_string() należy otworzyć połączenie z MySQL, w przeciwnym razie zostanie wygenerowany błąd poziomu E_WARNING i zwrócona zostanie wartość FALSE. Jeśli identyfikator_połączenia nie został zdefiniowany, zostanie użyte ostatnie połączenie do serwera MySQL.
Informacja:
Jeśli opcja magic_quotes_gpc została włączona, najpierw na danych należy użyć stripslashes(). Użycie tej funkcji samej spowoduje, że do danych zostaną dodane podwójne znaki unikowe.
Informacja:
Jeśli funkcja ta nie zostanie użyta na danych, zapytanie będzie podatne na ataki SQL Injection Attacks.
Informacja: mysql_real_escape_string() nie dodaje znaków unikowych do % i _. Te maski są stosowane w zapytaniach MySQL w połączeniu z LIKE, GRANT lub REVOKE.