(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
$łańcuch_bez_znaków_unikowych
[, resource $identyfikator_połączeniar
] )
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_bez_znaków_unikowych
Łańcuch, do którego zostaną dodane znaki unikowe.
identyfikator_połączenia
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
// Nie sprawdziliśmy zmiennej $_POST['password'], która może zawierać wszystko czego chciał użytkownik! Na przykład:
$_POST['username'] = 'aidan';
$_POST['password'] = "' OR ''='";
// Zapytanie pobierające pasujących użytkowników
$query = "SELECT * FROM users WHERE user='{$_POST['username']}' AND password='{$_POST['password']}'";
mysql_query($query);
// 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śliidentyfikator_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.