PHP mysql_real_escape_string() функция
Определение и использование
Функция mysql_real_escape_string() эскапирует особые символы в строках, используемых в SQL-запросах.
Следующие символы受到影响:
- \x00
- \n
- \r
- \
- '
- "
- \x1a
Если функция успешна, она возвращает эскапированную строку. Если функция失败了, она возвращает false.
Синтаксис
mysql_real_escape_string(string,connection)
Параметры | Описание |
---|---|
string | Обязательно. Определяет строку, которую нужно эскапировать. |
connection | Опционально. Определяет соединение MySQL. Если не указано, используется предыдущее соединение. |
Описание
Эта функция string в специальных символах и учитывая текущий набор символов подключения, поэтому может быть безопасно использован для mysql_query().
Советы и комментарии
Совет:Эта функция может быть использована для предотвращения атак на базу данных.
Пример
Пример 1
<?php $con = mysql_connect("localhost", "hello", "321"); if (!$con) { die('Could not connect: ' . mysql_error()); } // Код для получения имени пользователя и пароля // Эскапирование имени пользователя и пароля для использования в SQL $user = mysql_real_escape_string($user); $pwd = mysql_real_escape_string($pwd); $sql = "SELECT * FROM users WHERE user='" . $user . "' AND password='" . $pwd . "'" // Дополнительный код mysql_close($con); ?>
Пример 2
Атака на базу данных. Этот пример демонстрирует, что произойдет, если мы не применяем функцию mysql_real_escape_string() к имени пользователя и паролю:
<?php $con = mysql_connect("localhost", "hello", "321"); if (!$con) { die('Could not connect: ' . mysql_error()); } $sql = "SELECT * FROM users WHERE user='{$_POST['user']}' AND password='{$_POST['pwd']}'" mysql_query($sql); // Проверка имени пользователя и пароля не выполняется // Это может быть любая введенная пользователем информация, например: $_POST['user'] = 'john'; $_POST['pwd'] = '" OR ''='"; // Некоторые коды... mysql_close($con); ?>
Тогда SQL-запрос будет выглядеть так:
SELECT * FROM users WHERE user='john' AND password='' OR ''=''
Это означает, что любой пользователь может войти в систему, не вводя законного пароля.
Пример 3
Правильный способ предотвращения атак на базу данных:
<?php function check_input($value) { // Удаление обратных слешей if (get_magic_quotes_gpc()) { $value = stripslashes($value); } // Если это не цифра, добавьте кавычки if (!is_numeric($value)) { $value = "'" . mysql_real_escape_string($value) . "'"; } return $value; } $con = mysql_connect("localhost", "hello", "321"); if (!$con) { die('Could not connect: ' . mysql_error()); } // Выполнение безопасного 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); ?>