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