Funkcja PHP mysql_real_escape_string()
Definicja i użycie
Funkcja mysql_real_escape_string() przekształca specjalne znaki w ciągu używanym w SQL.
Poniższe znaki są dotknięte:
- \x00
- \n
- \r
- \
- '
- "
- \x1a
Jeśli działa pomyślnie, funkcja zwraca przekształcony ciąg. Jeśli nie działa, zwraca false.
Gramatyka
mysql_real_escape_string(string,connection)
Parametry | Opis |
---|---|
string | Wymagane. Określa ciąg do przekształcenia. |
connection | Opcjonalnie. Określa połączenie MySQL. Jeśli nie określono, używa poprzedniego połączenia. |
Opis
Ta funkcja string specjalne znaki są przekształcane, biorąc pod uwagę bieżącą czcionkę połączenia, więc można je bezpiecznie używać do mysql_query().
Wskazówki i komentarze
Wskazówka:Można użyć tej funkcji, aby zapobiec atakom na bazę danych.
Przykład
Przykład 1
<?php $con = mysql_connect("localhost", "hello", "321"); if (!$con) { die('Nie można połączyć: ' . mysql_error()); } // Kod uzyskiwania nazwy użytkownika i hasła // Transformujemy nazwę użytkownika i hasło, aby można je było użyć w SQL $user = mysql_real_escape_string($user); $pwd = mysql_real_escape_string($pwd); $sql = "SELECT * FROM users WHERE user='" . $user . "' AND password='" . $pwd . "'" // Więcej kodu mysql_close($con); ?>
Przykład 2
Atak na bazę danych. W tym przykładzie pokazujemy, co się stanie, jeśli nie zastosujemy funkcji mysql_real_escape_string() dla nazwy użytkownika i hasła:
<?php $con = mysql_connect("localhost", "hello", "321"); if (!$con) { die('Nie można połączyć: ' . mysql_error()); } $sql = "SELECT * FROM users WHERE user='{$_POST['user']}' AND password='{$_POST['pwd']}'"; mysql_query($sql); // Nie sprawdzamy nazwy użytkownika i hasła // Może to być jakiekolwiek zawartość wprowadzona przez użytkownika, np.: $_POST['user'] = 'john'; $_POST['pwd'] = "' OR ''='"; // Niektóry kod... mysql_close($con); ?>
Wtedy zapytanie SQL będzie wyglądać tak:
SELECT * FROM users WHERE user='john' AND password='' OR ''=''
To oznacza, że każdy użytkownik może zalogować się bez konieczności podania poprawnego hasła.
Przykład 3
Poprawne podejście do zapobiegania atakom na bazę danych:
<?php function check_input($value) { // Usuń ukośniki if (get_magic_quotes_gpc()) { $value = stripslashes($value); } // Jeśli nie jest liczbą, dodaj cudzysłów if (!is_numeric($value)) { $value = "'" . mysql_real_escape_string($value) . "'"; } return $value; } $con = mysql_connect("localhost", "hello", "321"); if (!$con) { die('Nie można połączyć: ' . mysql_error()); } // Bezpieczne SQL $user = check_input($_POST['user']); $pwd = check_input($_POST['pwd']); $sql = "SELECT * FROM users WHERE user=$user AND password=$pwd"; mysql_query($sql); mysql_close($con); ?>