Модераторы: 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   Вверх
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   Вверх
Mal Hack
Дата 4.1.2007, 01:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Wowa @  4.1.2007,  00:51 Найти цитируемый пост)
Что вы думаете по этому поводу? 

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


Шустрый
*


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

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



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


Опасность состоит в том, что любая ошибка может повлечь другую ошибку. К примеру при дальнейшем использовании результата ПХП вывалит ошибку, что это неправильный результат, укажет месторасположение скрипта.
Да и, например, если система находится, скажем, в стадии тестирования и вывод ошибок класса ДБ включен, то злоумышленник получит строку запроса, из которой узнает часть структуры базы. Это на первый взгляд кажется не значимым, но любой, кто сталкивался непосредственно с взломом систем, знает, что любая информация может быть полезной в этом деле и что хорошо защищённые системы должны давать минимум информации о своём внутреннем устройстве, естественно, не в ущерб удобности и функциональности.
PM MAIL   Вверх
Wowa
Дата 4.1.2007, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


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

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



Цитата(Mal Hack @  3.1.2007,  23:36 Найти цитируемый пост)
Это уже реализовано в PDO. 

Ты имеешь ввиду подстановку значений через PDO::prepare() ?


Код

<?php
/* Execute a prepared statement by passing an array of values */
$sql = 'UPDATE <table> SET
name = :name,
colour= :colour
;'
$sth = $dbh->prepare($sql, array(PDO::ATTR_CURSOR, PDO::CURSOR_FWDONLY));
$sth->execute(array(':name' => 'wowa', ':colour' => 'red'));
$red = $sth->fetchAll();
$sth->execute(array(':name' => 'dima', ':colour' => 'red'));
$yellow = $sth->fetchAll();
?> 


Так, как тут обновить более двух столбцов? Придется ведь имхо составлять новый запрос для этого.
PM WWW   Вверх
Mal Hack
Дата 4.1.2007, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Wowa @  4.1.2007,  14:54 Найти цитируемый пост)
Ты имеешь ввиду подстановку значений через PDO::prepare() ?

Да.

Цитата(Wowa @  4.1.2007,  14:54 Найти цитируемый пост)
Так, как тут обновить более двух столбцов? Придется ведь имхо составлять новый запрос для этого. 

А ты как хотел?
В конце концов никто не мешает сделать что-то вроде:
Код

<?php
/* Execute a prepared statement by passing an array of values */
$sql = 'UPDATE <table> SET
name = :name,
colour= :colour
pole2= :pole2
pole3 = :pole3
;'
$sth = $dbh->prepare($sql, array(PDO::ATTR_CURSOR, PDO::CURSOR_FWDONLY));
$sth->execute(array(':name' => 'wowa', ':colour' => 'red','pole2'=>'333','pole3'=>''));
$red = $sth->fetchAll();
$sth->execute(array(':name' => 'dima', ':colour' => 'red','pole2'=>'','pole3'=>'3'));
$yellow = $sth->fetchAll();
$sth->execute(array(':name' => 'dima', ':colour' => 'red','pole2'=>'','pole3'=>''));
?> 

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


Эксперт
Group Icon


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

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



Цитата(Mal Hack @  4.1.2007,  12:58 Найти цитируемый пост)
А ты как хотел?

так:
Код

$row = array(
  'id'   => 10,
  'date' => "2006-03-02"
);
$DB->query('UPDATE tbl SET ?a', $row);
// MySQL: UPDATE tbl SET `id`='10', `date`='2006-03-02'

Такой способ применяется тут: http://dklab.ru/lib/DbSimple/

Добавлено @ 15:12 
ведь так гораздо удобнее?
PM WWW   Вверх
Mal Hack
Дата 4.1.2007, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Wowa, при условии, что PDO работает также и запрос выглядит нагляднее, ИМХО, при условии, что он "вшит" в систему, DbSimple - не конкурент в принципе...
PM ICQ   Вверх
smartov
Дата 4.1.2007, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

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



Цитата(Wowa @  4.1.2007,  14:11 Найти цитируемый пост)
ведь так гораздо удобнее? 

Кстати в моем фреймворке я так и делаю.
Только еще боле просто.
Каждая таблица - класс наследуемый от базового таблицы, имеющего методы put, get и еще пару-восемь других полезных.
При создании класса таблицы задается имя реальной таблицы.
Так что в итоге все выглядит еще проще и нагляднее.

Код

//где-то в другом файле
class UsersTable extends Table
{
    $tableName = 'users';
    function UsersTable()
    {
    }
}


...

//там где мне надо
$usersTable = new UsersTable();

$row = array(
  'id'   => 10,
  'date' => "2006-03-02"
);

$usersTable->insert($row);


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


 




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


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

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