Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Мелочи]Обработка входящих данных , с помощью mysql_escape_string: стоит ли? 
:(
    Опции темы
m1kle
Дата 16.11.2007, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 2.5.2007
Где: Москва, Россия

Репутация: нет
Всего: нет



Есть одна мелочь.
Как лучше писать
Код

$e=$_GET['e']; $e = mysql_escape_string($e); 
// или 
$e=mysql_escape_string($_GET['e']);

$t=mysql_escape_string($_SESSION['username']);
// или 
$t=$_SESSION['username'];
$t=mysql_escape_string($t);

и почему?
PM MAIL WWW MSN   Вверх
skyboy
Дата 16.11.2007, 00:44 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Будь добр, в следующий раз называй тему адекватнее. Невнятно названные темы будут удаляться
Короткий ответ на вопрос: безразлично, в какой из двух вариантов форме писать.
Развернутый ответ: ни так, ни так писать не надо.
Во-первых, mysql_escape_string - морально устаревшая функция. Вместо неё надо использовать mysql_real_escape_string, которая безопаснее и надежнее.
Во-вторых, функция используется перед вставкой переменной в динамически формируемый запрос к MySQL. Для других целей лучше использовать другие средства.
mysql_real_escape_string экранирует 
Цитата

\x00, \n, \r, \, ', " и \x1a
Таким образом исключается ситуация, вроде такой:
Код

$name= 'Вася "Горилла" Пупкин';
$sql= 'SELECT * FROM `table` WHERE `name` = "'.$name.'"';
mysql_query($sql);

в случае чего будет попытка выполнения следующего запроса:
Код

SELECT  * FROM `table` WHERE `name` = "Вася "Горилла" Пупкин"

Благодаря подсветке синтаксиса, сходу видно, что работать нормально такой запрос не будет.
Вот при формировании запроса эту функцию и используй.
Кроме того, у тебя недочет:
Код

$e= $_GET['e'];

вернет ошибку(точнее - предупреждение/Warning) если скрипту через GET не был передан параметр "е". Потому лучше сделать проверку на isset. Впрочем, ещё лучше - не запихивать в отдельную переменную значение, которое и так у тебя никуда не денется($_GET).


Это сообщение отредактировал(а) skyboy - 16.11.2007, 00:45
PM MAIL   Вверх
vasac
Дата 16.11.2007, 08:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1060
Регистрация: 4.5.2006

Репутация: 8
Всего: 36



В чем глубинный смысл вопроса?
Писать две инструкции в одной строке или на двух?
PM WWW   Вверх
skyboy
Дата 16.11.2007, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



vasac, видимо - проверять данные при получении или уже перед использованием smile
PM MAIL   Вверх
m1kle
Дата 16.11.2007, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 2.5.2007
Где: Москва, Россия

Репутация: нет
Всего: нет



спасибо. Буду теперь использовать mysql_real_escape_string а нет ли на этом форуме темы, где написаны различия между mysql_escape_string() и mysql_real_escape_string()
PM MAIL WWW MSN   Вверх
kasmanaft
Дата 16.11.2007, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 16.11.2007

Репутация: 1
Всего: 2



Если верить мануалу, mysql_escape_string() идентична mysql_real_escape_string(), исключая то, что mysql_real_escape_string() принимает параметром ещё и указатель на соединение и экранирует в зависимости от кодировки. mysql_escape_string() не делает этого и результат работы не зависит от кодировки, в который вы работаете с БД.

PS я бы еще посоветовал перед применением этих функций, проверить, включены ли магические кавычки (get_magic_quotes_gpc()). А то, может быть, экранировать ничего и не надо. (а может быть, лучше будет в данном случае на входе применить stripslashes(), а уже на выводе mysql_real_escape_string() ).
PM MAIL   Вверх
m1kle
Дата 16.11.2007, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 2.5.2007
Где: Москва, Россия

Репутация: нет
Всего: нет



kasmanaft, во первых не понимаю смысл экранировать. Если выводить на экран, или подсвечивать - то это не нужно, я думал mysql_real_escape_string(); - надежнее или новее. Мне это для селектов, или для инсертов, не для выводов.
PM MAIL WWW MSN   Вверх
SelenIT
Дата 16.11.2007, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 32
Всего: 401



Цитата(m1kle @  16.11.2007,  22:30 Найти цитируемый пост)
во первых не понимаю смысл экранировать. ... Мне это для селектов, или для инсертов, не для выводов.

Для них экранировать и нужно, почему - см. ответ skyboyя или PHP FAQ:  \"Кавычки \". Cоставление запросов mysql, слеши, экранирование кавычек.

Цитата(m1kle @  16.11.2007,  22:30 Найти цитируемый пост)
mysql_real_escape_string(); - надежнее или новее

Можно сказать и так smile

Цитата(kasmanaft @  16.11.2007,  21:31 Найти цитируемый пост)
может быть, лучше будет в данном случае на входе применить stripslashes(), а уже на выводе mysql_real_escape_string()

Действительно лучше, т.к. поведение magic_quotes зависит и от других настроек (подробнее в FAQ выше).


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
m1kle
Дата 16.11.2007, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 2.5.2007
Где: Москва, Россия

Репутация: нет
Всего: нет



SelenIT, стоп. Зачем на выходе что то делать вообще? Если записалось по нормальному. то и выведется по нормальному.
PM MAIL WWW MSN   Вверх
SelenIT
Дата 17.11.2007, 00:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 32
Всего: 401



m1kle, смотря что и куда выводить. Если текст сомнительного происхождения (напр. запись в гостевой или форуме) выводится на HTML-странице, то нужно учесть, что злоумышленник мог вписать туда, например, яваскрипт, который ворует авторизационную куку юзера и отсылает на чужой сервер. Это называется XSS-уязвимость. Или просто навставлять левого HTML (напр. кучу закрывающих </td></table>) и поломать дизайн страницы. Чтобы подобный фокус не мог сработать, нужно как-то обработать текст перед выводом - проще всего с помощью htmlspecialchars.

Это сообщение отредактировал(а) SelenIT - 17.11.2007, 00:51


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
m1kle
Дата 17.11.2007, 00:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 2.5.2007
Где: Москва, Россия

Репутация: нет
Всего: нет



на htmlspecialchars я проверяю
PM MAIL WWW MSN   Вверх
m1kle
Дата 17.11.2007, 01:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 2.5.2007
Где: Москва, Россия

Репутация: нет
Всего: нет



А mysql_real_escape_string() так же как и mysql_escape_string() следует использовать на входе, а не на выходе.
PM MAIL WWW MSN   Вверх
SelenIT
Дата 17.11.2007, 03:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 32
Всего: 401



Конечно. Это ж по сути то же самое, только "более новое и надежное";)

А еще точнее - не "на входе", а при подстановке данных в SQL-запрос.


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
kasmanaft
Дата 17.11.2007, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 16.11.2007

Репутация: 1
Всего: 2



Цитата(m1kle @  16.11.2007,  22:30 Найти цитируемый пост)
kasmanaft, во первых не понимаю смысл экранировать. Если выводить на экран, или подсвечивать - то это не нужно, я думал mysql_real_escape_string(); - надежнее или новее. Мне это для селектов, или для инсертов, не для выводов.

Да, извиняюсь, неправильно выразился.. На выводе, конечно же, нужно применять htmlspecialchars(), а при запросе чего-либо в БД - mysql_real_escape_string().

...предварительно очистив полученные данные функцией stripslashes(). (если включены магические кавычки)

Это сообщение отредактировал(а) kasmanaft - 17.11.2007, 10:29
PM MAIL   Вверх
skyboy
Дата 17.11.2007, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Цитата(kasmanaft @  17.11.2007,  09:26 Найти цитируемый пост)
если включены магические кавычки

и так ко всем входящим данным stripslashes применять? не проще ли отказаться от magic quotes, используя set_magic_quotes_runtime?
PM MAIL   Вверх
vasac
Дата 17.11.2007, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1060
Регистрация: 4.5.2006

Репутация: 8
Всего: 36



quotes_runtime и quotes_gpc разные вещи. gpc в момент исполнения уже не отключишь.
PM WWW   Вверх
kasmanaft
Дата 17.11.2007, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 16.11.2007

Репутация: 1
Всего: 2



Цитата(skyboy @  17.11.2007,  10:41 Найти цитируемый пост)
не проще ли отказаться от magic quotes, используя set_magic_quotes_runtime?

Так оно разве спасет? Я, честно говоря, до сих пор не понял чего делает эта функция.
Код

<form action="" method="post">
<input name="text" />
<input type="submit" />
</form>

<?php
set_magic_quotes_runtime(1);
if (isset($_POST['text']))
    echo ($_POST['text']);
?>

PM MAIL   Вверх
skyboy
Дата 17.11.2007, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Цитата(kasmanaft @  17.11.2007,  10:01 Найти цитируемый пост)
Так оно разве спасет?

эта функция, по-моему, отключает magic quotes.
vasac, я ошибаюсь?
PM MAIL   Вверх
vasac
Дата 17.11.2007, 11:57 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1060
Регистрация: 4.5.2006

Репутация: 8
Всего: 36



magic_quotes_gpc нельзя отключить в сценарии, так же, как и register_globals, так как их действие происходит до начала выполнения.
Для конкретной папки/сайта можно отключить в .htaccess если php стоит, как модуль.
quotes_gpc экранирует входящие параметры из _GET, _POST, _COOKIE...
runtime при получении из базы, файлов и т.п. Вот её отключить можно.
PM WWW   Вверх
m1kle
Дата 17.11.2007, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 2.5.2007
Где: Москва, Россия

Репутация: нет
Всего: нет



Т.е. 100% защишенный скрипт это
Код

if(isset($_POST['a'])) $a=$_POST['a'];
$a=stripslashes($a);
$a=mysql_real_escape_string($a);
mysql_query("Запрос $a");
$a=htmlspecialchars($a);
echo $a;

PM MAIL WWW MSN   Вверх
kasmanaft
Дата 17.11.2007, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 16.11.2007

Репутация: 1
Всего: 2



Только вот stripslashes() нужно применять при включенных магических кавычках, а в htmlspecialchars() желательно передавать второй параметр "ENT_QUOTES"

Т.е. 
Код

<?php
if(isset($_POST['a'])) $a=$_POST['a'];
if (get_magic_quotes_gpc())
    $a=stripslashes($a);
mysql_query("SELECT ....... WHERE a='".mysql_real_escape_string($a)."'");
echo htmlspecialchars($a, ENT_QUOTES);
?>


Это сообщение отредактировал(а) kasmanaft - 17.11.2007, 14:57
PM MAIL   Вверх
SelenIT
Дата 17.11.2007, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 32
Всего: 401



m1kle, не 100%-ый. См. первую часть ответа kasmanaftа и - обязательно - PHP FAQ.


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
m1kle
Дата 17.11.2007, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 2.5.2007
Где: Москва, Россия

Репутация: нет
Всего: нет



SelenIT, а у kasmanaftа 100%й?
PM MAIL WWW MSN   Вверх
SelenIT
Дата 17.11.2007, 15:58 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 32
Всего: 401



95%-ный smile. С точки зрения прослешивания кавычек для такого простого случая - все в порядке. Но на случай отсутствия $_POST['a'] нужно предусмотреть логику более явно - например, инициализировать $a значением по умолчанию. Иначе в строке 4, по идее, все равно будет Notice о несуществующей переменной...


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
vasac
Дата 18.11.2007, 14:45 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1060
Регистрация: 4.5.2006

Репутация: 8
Всего: 36



Цитата

Т.е. 100% защишенный скрипт это

100%-защищенный скрипт это скрипт написанный программистом стопроцентно понимающим что он делает.
Вы не понимаете.
Вы выводите данные, пропущенные через mysql_escape_string на экран.
Разберитесь в каких случаях, какие проблемы возникают и какие есть способы их решения, а не валите всё в кучу.
PM WWW   Вверх
m1kle
Дата 18.11.2007, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 2.5.2007
Где: Москва, Россия

Репутация: нет
Всего: нет



Код

<?php
if(isset($_POST['a'])) $a=$_POST['a'];
else $a="";
if (get_magic_quotes_gpc())
    $a=stripslashes($a);
mysql_query("SELECT ....... WHERE a='".mysql_real_escape_string($a)."'");
echo htmlspecialchars($a, ENT_QUOTES);
?>

Так?
PM MAIL WWW MSN   Вверх
vasac
Дата 18.11.2007, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1060
Регистрация: 4.5.2006

Репутация: 8
Всего: 36



Уже лучше
PM WWW   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1144 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.