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

Поиск:

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


Эксперт
Group Icon


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

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



Я написал следующую функцию, в которую можно передавать запрос, а на выходе получить экранированный запрос.
Экранированы будут только те символы, которым содержатся в $_GET или  $_POST.


Код

    function escape_query($query) {
        
        foreach (array_merge ($_GET, $_POST) as $k=>$v) {

            if (($v!='') && (strpos($query, $v)) ) {
                // Экранируем
                $query=str_replace($v, mysql_real_escape_string($v), $query);                
            }
        }
        return $query;
    }



Давайте обсудим такой подход... Т.к. если перед каждым запросом делать отдельно mysql_real_escape_string() или intval(), то работы много и можно что-нибудь пропустить. В результате повышается вероятность взлома.

Добавлено @ 21:10 
Для тех, кто не в курсе о чем речь и для чего это делается, читайте тут: http://de.php.net/manual/ru/function.mysql...cape-string.php
Там также описано, как можно легко взламывать скрипты, если не проверять переменные от юзеров.  
PM WWW   Вверх
ZlojEzh
Дата 11.5.2006, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

  $query = "update `table_name` set `a`='".$_POST['a']."',`b`='".$_POST['b']."' where code='".$_POST['code']."';";


при входных данных вида:
Код

$_POST['a'] = "',`";

функция кажись работать не будет (поскольку заменяются все вхождения "',`")

я бы посоветовал использовать шаблон Table Data Gateway и забыть про sql-код в самих скриптах
вкратце можно почитать здесь: http://www.martinfowler.com/eaaCatalog/gateway.html
 
PM MAIL ICQ   Вверх
Wowa
Дата 11.5.2006, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


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

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



Цитата(ZlojEzh @  11.5.2006,  08:32 Найти цитируемый пост)
при входных данных вида:

Что-то я сомневаюсь, что такие входные данные могут быть. 
PM WWW   Вверх
ZlojEzh
Дата 11.5.2006, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

если влом писать по шлюзу на каждую сущность БД, можно использовать PEAR::DB
функции prepare/execute

Добавлено @ 10:56 
я про PEAR::DB
смайлы отключить забыл...
PM MAIL ICQ   Вверх
Wowa
Дата 11.5.2006, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


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

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



Цитата(ZlojEzh @  11.5.2006,  09:55 Найти цитируемый пост)
при любом совпадении значения одной из переменных с частью строки запроса (если эта часть содержит спецсимволы) получится ошибка

ничего не при любом. Глюк только при передачи спец. символов может быть. А когда ожидаешь прихода спец. символов, то всегда можно их экранировать ДО передачи в функцию. Часто ли вы передаете в ГЕТ или ПОСТ запросе спец. символы? Ответ: оооооооооооочень редко.

А служебные слова INSERT, SELECT и т.п., все равно не экранируются ведь. Так, что все довольно надежно имхо.

Добавлено @ 11:06 
Цитата(ZlojEzh @  11.5.2006,  09:55 Найти цитируемый пост)
если влом писать по шлюзу на каждую сущность БД, можно использовать PEAR:smileB
функции prepare/execute

Не вижу необходимости.. 
PM WWW   Вверх
ZlojEzh
Дата 12.5.2006, 01:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Wowa @  11.5.2006,  11:05 Найти цитируемый пост)
А когда ожидаешь прихода спец. символов, то всегда можно их экранировать ДО передачи в функцию

хм... тогда я что-то не уловил, зачем нужно повторное экранирование?... 

Цитата(Wowa @  11.5.2006,  11:05 Найти цитируемый пост)
Часто ли вы передаете в ГЕТ или ПОСТ запросе спец. символы? Ответ: оооооооооооочень редко.

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


Цитата(Wowa @  11.5.2006,  11:05 Найти цитируемый пост)
Не вижу необходимости.. 

ты про PEAR или про шлюзы данных? 
PM MAIL ICQ   Вверх
Wowa
Дата 12.5.2006, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


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

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



Цитата(ZlojEzh @  12.5.2006,  00:59 Найти цитируемый пост)
хм... тогда я что-то не уловил, зачем нужно повторное экранирование?... 

Что непонятного? smile Тебе по-любому нужно экранировать все переменные получаемые от юзера. А это трудоемко и не раз бывало уже, что разработчики забывали что-нибудь экранировать.

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

Ты говоришь, что от юзера могут прийти спец. символы который не надо экранировать, а моя функция все равно их заэкранирует. Где ты видешь тут проблему? Экранирование происходит только в запросе. И экранируется как раз те спец. символы, которые способны "поломать" запрос. Так, что все правильно.


Цитата(ZlojEzh @  12.5.2006,  00:59 Найти цитируемый пост)
ты про PEAR или про шлюзы данных?  

Я про Pear в данном случае. Про шлюзы данных - я не понял, что ты имел ввиду.

Добавлено @ 16:11 
Цитата(ZlojEzh @  12.5.2006,  00:59 Найти цитируемый пост)
функция должна выполнять свою задачу не основываясь на предположениях относительно входных параметров (

А она и выполняет. Читай выше. Экранируются только символы  в запросе, которые его могут "поломать". 
PM WWW   Вверх
ZlojEzh
Дата 13.5.2006, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

Цитата(Wowa @  12.5.2006,  16:09 Найти цитируемый пост)
Ты говоришь, что от юзера могут прийти спец. символы который не надо экранировать, а моя функция все равно их заэкранирует

не говорил я такого...
проблема появляется, когда одна из переменных совпадает с какой-либо частью запроса
например, вряд ли стоит заменять в sql-запросе все кавычки на mysql_real_escape_string('\'');


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

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


Эксперт
Group Icon


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

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



Цитата(ZlojEzh @  13.5.2006,  09:27 Найти цитируемый пост)
просто создается класс полностью инкапсулирующий в себе связь с базой данных для какой-то сущности из предметной области
а в него уже встраиваются све необходимые проверки

Да... вот я и привел функцию, которая могла бы в такой класс войти.



Цитата(ZlojEzh @  13.5.2006,  09:27 Найти цитируемый пост)
вопрос остается: для чего тогда вызывать эту функцию, если данные уже экранированы?

Хм.... вот двойные кавычки. Да... Они могут часто в запросе приходить. Ты уверен, что двойные тоже экранируются? 
PM WWW   Вверх
ZlojEzh
Дата 13.5.2006, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Wowa @  13.5.2006,  10:46 Найти цитируемый пост)
Да... вот я и привел функцию, которая могла бы в такой класс войти.

ты что... ни в коем случае
иначе смысла писать такие классы - ноль
она же готовый sql-запрос принимает

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

Цитата(Wowa @  13.5.2006,  10:46 Найти цитируемый пост)
Хм.... вот двойные кавычки. Да... Они могут часто в запросе приходить. Ты уверен, что двойные тоже экранируются? 

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

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


Эксперт
Group Icon


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

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



но ведь все данные, которые мы получаем от клиента мы должны экранировать. Даже, если в них есть кавычки. Если ты не заэкранируешь, то вероятность взлома есть.

Добавлено @ 11:24 
Нужно или по отдельности экранировать, что небезопасно или же в моей функции все сразу. 
PM WWW   Вверх
ZlojEzh
Дата 13.5.2006, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



если ты не экранируешь данные до вызова функции - эта функция может работать неправильно и выдать битый sql-запрос
если ты экранируешь данные до вызова функции - то вызывать ее второй раз нельзя, поскольку данные проэкранируются еще раз и на месте каждой одинарной кавычки получится \\\' 
PM MAIL ICQ   Вверх
Wowa
Дата 13.5.2006, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


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

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



Цитата(ZlojEzh @  13.5.2006,  10:32 Найти цитируемый пост)
если ты не экранируешь данные до вызова функции - эта функция может работать неправильно и выдать битый sql-запрос

Не может,  т.к не будет найдено совпадение.



Цитата(ZlojEzh @  13.5.2006,  10:32 Найти цитируемый пост)
если ты экранируешь данные до вызова функции - то вызывать ее второй раз нельзя, поскольку данные проэкранируются еще раз и на месте каждой одинарной кавычки получится \\\'  

Двойное экранирование невозможно, если пользоваться моей функцией.
  
PM WWW   Вверх
ZlojEzh
Дата 13.5.2006, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Wowa @  13.5.2006,  11:37 Найти цитируемый пост)
Не может,  т.к не будет найдено совпадение.

элементарный пример: $_POST['a'] = " ' " (пробелы только для удобочитаемости)

и вообще, давай определимся - данные из $_GET ($_POST) должны экранироваться до вызова функции, или нет? 
PM MAIL ICQ   Вверх
Wowa
Дата 13.5.2006, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


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

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



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

Пример хороший, но практически нереальный. Это исключение. Видимо имеет смысл добавить в функцию соответствующую проверку.
Это лучше, чем экранировать все по одиночке. Еще пример можешь привести?


Цитата(ZlojEzh @  13.5.2006,  10:43 Найти цитируемый пост)
и вообще, давай определимся - данные из $_GET ($_POST) должны экранироваться до вызова функции, или нет?  

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


 




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


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

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