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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Автомат. применение escape_string для запроса, mysql_real_escape_string 
V
    Опции темы
ZlojEzh
Дата 13.5.2006, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



имхо, ты себе проблемы лишние выдумывешь...
таких примеров может быть много, это просто самый очевидный.
тут прийдется запретить пользователю вообще вводить спецсимволы

вообщем, мое личное мнение: метод небезопасный и не универсальный

есть же два чудных варианта: PEAR и шлюзы данных (относительно последнего - есть несколько типовых решений) 
PM MAIL ICQ   Вверх
Wowa
Дата 13.5.2006, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

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



Цитата(ZlojEzh @  13.5.2006,  10:54 Найти цитируемый пост)
таких примеров может быть много, это просто самый очевидный.

Приведи их!


Цитата(ZlojEzh @  13.5.2006,  10:54 Найти цитируемый пост)
тут прийдется запретить пользователю вообще вводить спецсимволы

Ты ошибаешься.

Цитата(ZlojEzh @  13.5.2006,  10:54 Найти цитируемый пост)
вообщем, мое личное мнение: метод небезопасный и не универсальный

чепуха. Я уже несколько раз показывал, что как раз это более безопасное решение.



Цитата(ZlojEzh @  13.5.2006,  10:54 Найти цитируемый пост)
вообщем, мое личное мнение: метод небезопасный и не универсальный

а аргументировать ты так и не смог.

 
PM WWW   Вверх
ZlojEzh
Дата 13.5.2006, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



" ' "
" ',' "
" (' "
" ',`"

Код

  function escape_query($query) {
    foreach (array_merge ($_GET, $_POST) as $k=>$v) {
      if (($v!='') && (strpos($query, $v)) ) {
        $query=str_replace($v, mysql_escape_string($v), $query);
      }
    }
    return $query;
  }

  $_GET['a'] = "'";
  $_GET['b'] = "',`";
  $_GET['c'] = "','";
  $_GET['c'] = "('";

  $_POST['param1'] = 'value1';
  $_POST['param2'] = 'value2';
  $_POST['param3'] = 'value3';

  $query = escape_query("select * from `table_name` where `param1`='".$_POST['param1']."';");
  $query2 = escape_query("update `table_name`
                          set `param1`='".$_POST['param1']."',
                              `param2`='".$_POST['param1']."'
                          where param3='".$_POST['param3']."';");
  $query3 = escape_query("insert into `table_name` (`param1`,`param2`,`param3`)
                                values ('".$_POST['param1']."','".$_POST['param2']."','".$_POST['param3']."');");


  print $query."\n";
  print $query2."\n";
  print $query3."\n\n";


Код

select * from `table_name` where `param1`=\'value1\';
update `table_name`
                          set `param1`=\'value1\',
                              `param2`=\'value1\'
                          where param3=\'value3\';
insert into `table_name` (`param1`,`param2`,`param3`)
                                values (\'value1\',\'value2\',\'value3\');

сразу становится понятно, что метод безопасен, надежен и универсален...

PM MAIL ICQ   Вверх
Wowa
Дата 13.5.2006, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

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



Цитата(ZlojEzh @  13.5.2006,  11:40 Найти цитируемый пост)
" ' "
" ',' "
" (' "
" ',`"

По моим предположением, если через GET или POST злоумышленник такое отправит, то взлом скрипта не произойдет. Запрос просто не выполнится, что и требуется. Согласен? Где опастность?


На практики же приведенные тобой символы передавать нет никакой необходимости НИКОГДА. Поэтому я, как разработчик, ни с какими ограничениями не сталкиваюсь. Зато уверен, что неэкранированным НИЧЕГО не пройдет. Надежность повышается.

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


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 11.5.2003
Где: Dnepropetrovsk, U A

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



А я как то вообще не ломаю себе голову по поводу всего этого...
идем в пхп.ини и ставим magic_quotes=on
И все уже в скрипт попадает "слешованое".
 


--------------------
web developer/telecommunication specialist.
mailto: [email protected]
ICQ#28442924

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


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

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



Цитата(Alone @  13.5.2006,  13:02 Найти цитируемый пост)
magic_quotes=on

экранирует не все. что mysql_escape_string 
PM WWW   Вверх
Alone
Дата 15.5.2006, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 11.5.2003
Где: Dnepropetrovsk, U A

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



Цитата

;; Magic quotes for incoming GET/POST/Cookie data.
magic_quotes_gpc = On


Если в БД будет ложится то что приходит от клиента через GET/POST/Cookies data то этого хватит.
В дургих случаях, когда например данные поступают из потока(файла) - согласен, надо использовать свой механизм. 


--------------------
web developer/telecommunication specialist.
mailto: [email protected]
ICQ#28442924

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


Шустрый
*


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

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



Цитата(Wowa @  13.5.2006,  13:27 Найти цитируемый пост)
По моим предположением, если через GET или POST злоумышленник такое отправит, то взлом скрипта не произойдет. Запрос просто не выполнится, что и требуется. Согласен? Где опастность?


Блин, да любой нормальный сайт должен поддерживать '. Допустим нужно в БД занести имя компании, а оно выглядит типа

Brother's Company

И все, ошибка. Примеров таких полно. И тебя пользователи просто засыпят письмами.

З.Ы. Не уверен насчет русских сайтов, но на английские точно (у них же ' весьма сильно используется в языке)
 
PM MAIL   Вверх
Wowa
Дата 22.5.2006, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

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



Цитата(madFobos @  22.5.2006,  13:19 Найти цитируемый пост)
Блин, да любой нормальный сайт должен поддерживать '.

А оно поддерживается без проблем. 
PM WWW   Вверх
Wowa
Дата 2.1.2007, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

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



Кстати, кто-нибудь знает, зачем mysql_real_escape_string экранирует \r\n ?
PM WWW   Вверх
Mal Hack
Дата 2.1.2007, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



Из комментариев в манеале:
Цитата
Note that mysql_real_escape_string doesn't prepend backslashes to \x00, \n, \r, and and \x1a as mentionned in the documentation, but actually replaces the character with a MySQL acceptable representation for queries (e.g. \n is replaced with the '\n' litteral). (\, ', and " are escaped as documented) This doesn't change how you should use this function, but I think it's good to know.


Если их не квотить запрос может получиться вида:
Цитата
INSERT INTO `table` VALUES `t` = 'kjashdkajhdjkah



asdasdasd
asd'

Т.е. \n\r будут относиться не к тексту, а к запросу, т.е. в базу вставиться единая строка, безе переводов строк..

PM ICQ   Вверх
coyl
Дата 4.1.2007, 00:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Я тоже не согласен с таким подходом. Если вызывать эту функцию, то она проэкранирует все без исключения входные параметры, но ведь некоторые параметры могут не использоваться в запросе, тогда их придётся обратно деэкранировать, а это лишняя работа.
ИМХО надо просто писать класс абстракции БД и в него вшивать проверки. Это, конечно, тоже не очень красивый вариант (его сложно грамотно реализовать), но более удобного вариант для пользователя (для пользователя класса \программиста\) и не придумаешь.

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

А по поводу того, что:

Цитата(Wowa @  13.5.2006,  11:47 Найти цитируемый пост)
элементарный пример: $_POST['a'] = " ' " (пробелы только для удобочитаемости)

Пример хороший, но практически нереальный.


Взломщики придумывают всегда самые нереальные входные параметры. Это неоспоримо.

PM MAIL   Вверх
Mal Hack
Дата 4.1.2007, 00:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



Цитата(coyl @  4.1.2007,  00:40 Найти цитируемый пост)
Если вызывать эту функцию, то она проэкранирует все без исключения входные параметры, но ведь некоторые параметры могут не использоваться в запросе

Это вы по отношению к какой функции?
PM ICQ   Вверх
coyl
Дата 4.1.2007, 00:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



К предложенной WOWA

\правка\
Уф... после бурного НГ внимательность на нуле. =) не считается

Это сообщение отредактировал(а) coyl - 4.1.2007, 00:50
PM MAIL   Вверх
Wowa
Дата 4.1.2007, 00:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

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



Цитата(coyl @  3.1.2007,  22:47 Найти цитируемый пост)
К предложенной WOWA 

да, это недостаток конечно.. 

Сейчас я думаю, что самым мудрым решеним является создание функций для Инсерта и Апдейта отдельных.

И передавать значения в функции через массив.

типа:

Код

$a=array(
'name'=>$_POST['name'],
'title'=>$_POST['title'],
'where'=>"WHERE id=4"
);

update($table_name, $a);


А функция update тогда уже заэкранирует все эти символы. Точно также и с Инсертом.
Кроме того, тут очевидный плюс то, что легче переменные указывать.. Меньше вероятность ошибки, когда через INSERT что-то не в тот столбец  запишешь.

Что вы думаете по этому поводу?
PM WWW   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




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


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

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