Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: что такое mysql_real_escape_string() ?
 
 автор: parti   (16.03.2008 в 20:21)   письмо автору
 
 

собстно, что эта функция делает, и зачем она нужна?

   
 
 автор: moonfox   (16.03.2008 в 21:47)   письмо автору
 
   для: parti   (16.03.2008 в 20:21)
 

иногда об этом пишут в мануале

mysql_real_escape_string
(PHP 4 >= 4.3.0, PHP 5)

mysql_real_escape_string -- Экранирует специальные символы в строках для использования в выражениях SQL
Описание
string mysql_real_escape_string ( string unescaped_string [, resource link_identifier] )


Экранирует специальные символы в unescaped_string, принимая во внимание кодировку соединения, таким образом, что результат можно безопасно использовать в SQL-запросе в функци mysql_query(). Если вставляются бинарные данные, то к ним так же необходимо применять эту функцию.

mysql_real_escape_string() вызывает библиотечную функцмю MySQL mysql_real_escape_string, которая добавляет обратную косую черту к следующим символам: \x00, \n, \r, \, ', " and \x1a.

Эта функция должна всегда (за несколькими исключениями) использоваться для того, чтобы обезопасить данные, вставляемые в запрос перед отправкой его в MySQL.

Список параметров


unescaped_string
Строка, которая должна быть экранирована.

link_identifier
The MySQL connection. If the link identifier is not specified, the last link opened by mysql_connect() is assumed. If no such link is found, it will try to create one as if mysql_connect() was called with no arguments. If by chance no connection is found or established, an E_WARNING level warning is generated.


Возвращаемые значения
Возвращает строку, в которой экранированы все необходимые символы, или FALSE в случае ошибки.

Примеры
Пример 1. Простой пример использования mysql_real_escape_string()

<?php
// Connect
$link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password')
OR die(mysql_error());

// Query
$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
mysql_real_escape_string($user),
mysql_real_escape_string($password));
?>



Пример 2. Пример взлома с использованием SQL Injection

<?php
// посылаем запрос, чтобы проверить имя и пароль пользователя
$query = "SELECT * FROM users WHERE user='{$_POST['username']}' AND password='{$_POST['password']}'";
mysql_query($query);

// Мы не никак проверили переменную $_POST['password'],
// а она может содержать совсем не то, что мы ожидали. Например:
$_POST['username'] = 'aidan';
$_POST['password'] = "' OR ''='";

// посмотрим, какой запрос будет отправлен в MySQL:
echo $query;
?>

Запрос, который будет отправлен в MySQL:

SELECT * FROM users WHERE name='aidan' AND password='' OR ''=''


Это позволит кому угодно войти в систему без пароля.



Пример 3. Лучший вариант составления запроса

Применение mysql_real_escape_string() к каждой переменной, вставляемой в запрос, предотвращает SQL Injection. Нижеследующий код является наилучшим вариантом составления запросов и не зависит от установки Magic Quotes.

<?php
// Функция экранирования переменных
function quote_smart($value)
{
// если magic_quotes_gpc включена - используем stripslashes
if (get_magic_quotes_gpc()) {
$value = stripslashes($value);
}
// Если переменная - число, то экранировать её не нужно
// если нет - то окружем её кавычками, и экранируем
if (!is_numeric($value)) {
$value = "'" . mysql_real_escape_string($value) . "'";
}
return $value;
}

// Соединяемся
$link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password')
OR die(mysql_error());

// Составляем безопасный запрос
$query = sprintf("SELECT * FROM users WHERE user=%s AND password=%s",
quote_smart($_POST['username']),
quote_smart($_POST['password']));

mysql_query($query);
?>

Запрос, составленный таким образом, будет выполнен без ошибок, и взлом с помощью SQL Injection окажется невозможен.



Примечания
Замечание: Функцию mysql_real_escape_string() можно использовать только после того, как установлено соединение с MySQL. В противном случае возникнет ошибка уровня E_WARNING, а функция возвратит FALSE. Если link_identifier не указан, используется последнее открытое соединение.

Замечание: Если magic_quotes_gpc включены, то сначала данные следует обработать функцией stripslashes(). Если mysql_real_escape_string() применяется к данным, которые уже были прослешены, то в результате слеши в данных будут удваиваться.

Замечание: Если не пользоваться этой функцией, то запрос становится уязвимым для взлома с помощью SQL Injection.

Замечание: mysql_real_escape_string() не экранирует символы % и _. Эти знаки являются масками групп символов в операторах MySQL LIKE, GRANT или REVOKE.

   
 
 автор: Max Vasin   (16.03.2008 в 21:52)   письмо автору
 
   для: moonfox   (16.03.2008 в 21:47)
 

не успел:)

----
Regards, Max Vasin.

   
 
 автор: cheops   (16.03.2008 в 23:14)   письмо автору
 
   для: parti   (16.03.2008 в 20:21)
 

Тоже самое, что и mysql_escape_string(), только в отличие от последней, не работает, если не установленно соединение с базой данных. Применение описывается в теме по ссылке http://www.softtime.ru/forum/read.php?id_forum=3&id_theme=50865.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования