The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Режим отображения отдельной подветви беседы [ Отслеживать ]

Оглавление

Кардинальный метод защиты от XSS и атак по подстановке SQL-з..., opennews (??), 17-Июн-10, (0) [смотреть все]

Сообщения [Сортировка по времени | RSS]


14. "bind"  +5 +/
Сообщение от tonnzor (?), 17-Июн-10, 01:45 
Во всех нормальных библиотеках это происходит и так (псевдокод):

$query = parse("select * from users where id = :users")
$query->bind('users', $users);
$query->execute();

И в MySQL, и в Oracle такое есть.

Ответить | Правка | Наверх | Cообщить модератору

16. "bind"  +/
Сообщение от filosofem (ok), 17-Июн-10, 01:59 
Автор это объясняет тем, что ни один програмер не пишет параметризированные запросы, кроме как под дулом пистолета. Якобы это сложнее, чем его костыль.
Не исключено, что в некоторых случаях так и есть. Или например когда сервер достался от некрофилов с каким-нибудь php4.
Ответить | Правка | Наверх | Cообщить модератору

27. "bind"  +3 +/
Сообщение от Sabitov (?), 17-Июн-10, 06:51 
Фигня :)

Параметризованные запросы сильно ускоряют работу при использовании нормальных СУБД, даже безотносительно к безопасности. Кодеры, которые не используют таких запросов, должны лишаться ЗП в обязательном порядке! :)

К сожалению, пыхпых 5 не умеет их поддерживать, если используется mysql, а не mysqli :( Но это уже другая песня.


Ответить | Правка | Наверх | Cообщить модератору

29. "bind"  +/
Сообщение от filosofem (ok), 17-Июн-10, 08:22 
Зачем mysqli да, если есть выбор пиши под постгрес, не пожалеешь. =)
И автора не обижайте, уверен, что он пошутил, насчет "никто не пишет".
Ответить | Правка | Наверх | Cообщить модератору

61. "bind"  +1 +/
Сообщение от Pashugan (?), 17-Июн-10, 13:07 
Раз уж пошла такая пьянка... Есть неочевидный фактор, который заставляет меня усомниться в справедливости Вашей зарплаты. ;) Время выполнения запроса к типичному веб-приложению - доли секунды. Если оно реализовано на скриптовых языках по стандартной схеме типа apache+mod_php5, то через эту долю секунды процесс умирает вместе со всеми объектами параметризированных запросов, и они будут создаваться заново при каждом новом запросе. Количество использований каждого из prepared statements (речь ведь идёт о них?) в таком приложении будет скорее всего равно 1. Более того, так и должно быть, мы ведь не делаем селекты в цикле, верно? :) Соответственно, те выгоды, о которых Вы говорите, проявляются лишь в приложениях, которые непрерывно висят в памяти и не собирают контекст на каждый чих, будь то java-сервлеты или скрипты+fastcgi. Я замерял, биндинг mysqli проигрывал примерно на 30% конкатенации+mysql_real_escape_string(), хотя эта цифра может служить для ориентировки.
Ответить | Правка | К родителю #27 | Наверх | Cообщить модератору

80. "bind"  –1 +/
Сообщение от аноним (?), 17-Июн-10, 17:19 
>Раз уж пошла такая пьянка... Есть не очевидный фактор, который заставляет меня усомниться в справедливости Вашей зарплаты. ;)

Ты написал тупость, которая даже в мена костыле MySQL уже не соответствует действительности ...

Простой вопрос на засыпку, что происходит (в нормальных DBMS) после того как парсер разобрал параметризованный запрос, но до того как ты забиндил значение и позвал экзекутор?
Подсказка: ну хорошо - позвал ты экзекутор, что происходит дальше?


Вот - вот, семь раз RTFM - один раз ...  :)

Ответить | Правка | Наверх | Cообщить модератору

86. "bind"  +1 +/
Сообщение от Ivan1986email (?), 17-Июн-10, 20:35 
Вообще написал он правильно - разница в скорости выполнения минимальна.
Вызов функций биндинга даже чуть подороже, чем склейка строки + эскейпинг. Вобщем мы от этого отказались еще года два назад, когда только написал для симплы драйвер PDO, сначала написал с биндингом параметров, потом поставил опцию раскрытия симплой - получилось быстрее.

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

Ответить | Правка | Наверх | Cообщить модератору

92. "bind"  +1 +/
Сообщение от onk (?), 18-Июн-10, 11:44 
Вы в корне не правы (или правы в некотором частном случае)!
может быть для MySQL это и правда, но приличные СУБД (в частности Oracle) _кешируют_ запросы после парсинга. в итоге запрос повторно разбирать не нужно!
собственно число запросов в приложении конечно и при достаточном обьеме кеша у СУБД это неплого ускоряет работу.
Ответить | Правка | Наверх | Cообщить модератору

94. "bind"  +/
Сообщение от Pashugan (?), 18-Июн-10, 14:52 
>Вы в корне не правы (или правы в некотором частном случае)!
>может быть для MySQL это и правда, но приличные СУБД (в частности
>Oracle) _кешируют_ запросы после парсинга. в итоге запрос повторно разбирать не
>нужно!
>собственно число запросов в приложении конечно и при достаточном обьеме кеша у
>СУБД это неплого ускоряет работу.

Так ли в корне он неправ? Помимо времени на компиляцию запроса есть ещё фактор двойной передачи данных - запроса и параметров. Скорее всего, вычисление ключа кеша осуществляется на сервере, а значит текст запроса всё равно нужно сначала передать на сервер. Так что продолжать спорить считаю бессмысленным, и если у Вас есть под рукой Oracle с быстрым надёжным каналом до него, буду рад увидеть результаты тестов.

Ответить | Правка | Наверх | Cообщить модератору

93. "bind"  +/
Сообщение от Pashugan (?), 18-Июн-10, 14:39 
Я знаю, что правильно написал, потому что проверял это реальными тестами mysqli, а не просто занимался упражнениями в красноречии. :) Также я всегда готов выслушать обоснованные возражения и по-нормальному поспорить, чтобы докопаться до истины, но не вижу смысла отвечать анонимусам, которые готовы только гадить на голову коллег по цеху, но по существу вопроса ничего не пишут. :)
Ответить | Правка | К родителю #86 | Наверх | Cообщить модератору

97. "bind"  +1 +/
Сообщение от tupkaemail (?), 18-Июн-10, 19:34 
>Вот - вот, семь раз RTFM - один раз ...  :)

Семь раз RTFM, один раз rm -rf :D

Ответить | Правка | К родителю #80 | Наверх | Cообщить модератору

30. "bind"  +1 +/
Сообщение от Ivan1986email (?), 17-Июн-10, 09:08 
Полная чушь, если нормально реализовано, то никто просто не захочет писать не параметризованные запросы, так как они сильно упрощают код.

В PDO как раз реализовано не нормально - синтаксис многословный.
Посмотрите как реализовано тут - http://dklab.ru/lib/DbSimple/

$db->select('select * from table where fname=? {AND id IN (?a)}', 'user', array(1,2,3));

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

Ответить | Правка | К родителю #16 | Наверх | Cообщить модератору

33. "bind"  +/
Сообщение от Lain_13 (?), 17-Июн-10, 09:44 
Вся прелесть параметризованных запросов как-то в миг рушится, когда параметром оказывается часть имени таблицы. Ещё хуже, когда перестраиваются фрагменты запроса и в нём появляются/исчезают вложенные подзапросы и уровни вложенности этих запросов.
Ответить | Правка | Наверх | Cообщить модератору

37. "bind"  +1 +/
Сообщение от ivan1986email (?), 17-Июн-10, 10:06 
Сходите по ссылке

'select * from ?_table' - префикс - по сути самый часто используемый вариант
'select * from ?# where ...', 'tbl' - имя
Вложенные подзапросы тоже есть, плюс в новой версии на форуме есть плейсхолдер подзапроса, можно творить такое, что я уже не знаю что туда можно добавить.

http://forum.dklab.ru/viewtopic.php?p=180253#180253

К сожалению либа была заброшена немного, но сейчас в составе фреймворка развивается
https://sourceforge.net/projects/quickfw/

Ответить | Правка | Наверх | Cообщить модератору

81. "bind"  +1 +/
Сообщение от аноним (?), 17-Июн-10, 17:24 
>Сходите по ссылке
>'select * from ?_table' - префикс - по сути самый часто используемый вариант

Дык кто бы сомневался - творчеВство пехепешников - оно вообще вштыряет не по детски.

То что такими гениальными запросами ставится на колени любая субд на любом железе уже "не проблемма кодера" да? :)


Ответить | Правка | Наверх | Cообщить модератору

43. "bind"  +/
Сообщение от filosofem (ok), 17-Июн-10, 11:17 
Что именно чушь? Если СУБД не поддерживает параметризированные запросы, то никакой API их не сделает. Как вы собираетесь писать параметризированные запросы к какой-нибудь MSSQL 2k, или как вы будете делать аудит кода на php4, переписывать полностью на php5?

ИМХО чушь это использовать на продакшне непонятные ноунэйм библиотеки. Вы проверяли, что эта DbSimple действительно делает параметризированные запросы? А вы уверены, что она так со всеми запросами будет делать? Или, что в ней нет многолетней дыры, которую просто некому заделывать, потому что никому не надо?
То что в API выглядит запросом с параметрами, к СУБД может идти обычной строкой.

Ответить | Правка | К родителю #30 | Наверх | Cообщить модератору

44. "bind"  +/
Сообщение от ivan1986email (?), 17-Июн-10, 11:25 
Я ее дописывал, а не только проверял.
Что может - использует встроенные параметризации, что нет - раскрывает и сама экранирует.
В случае, если параметры не поддерживаются, то конечно идет обычной экранируемой строкой.
Почему-то в PDO нету подстановки в качестве параметров массивов, идентификаторов, и прочих полезных вещей.
Ответить | Правка | Наверх | Cообщить модератору

46. "bind"  +/
Сообщение от Аноним (-), 17-Июн-10, 11:33 
>Я ее дописывал, а не только проверял.
>Что может - использует встроенные параметризации, что нет - раскрывает и сама
>экранирует.
>В случае, если параметры не поддерживаются, то конечно идет обычной экранируемой строкой.
>
>Почему-то в PDO нету подстановки в качестве параметров массивов, идентификаторов, и прочих
>полезных вещей.

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

Ответить | Правка | Наверх | Cообщить модератору

48. "bind"  +/
Сообщение от ivan1986email (?), 17-Июн-10, 11:44 
А вам не кажется, что придумывание своего велосипеда, который хоть и известен до каждого винтика, но как всегда получится с квадратными колесами (доказано огромным количеством примером - столько CMS/форумов/фреймворков приделают в качестве доступа к базе такую фигню, что за голову берешься), взяли бы хоть PDO, и то лучше было бы.

Экранируется кстати стандартными функциями - mysql_real_escape в случае mysql, pdo::quote в случае PDO, и так далее.

Ответить | Правка | Наверх | Cообщить модератору

50. "bind"  +/
Сообщение от Аноним (-), 17-Июн-10, 11:49 
>Экранируется кстати стандартными функциями - mysql_real_escape в случае mysql,

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

http://secunia.com/advisories/20365/
"The vulnerability is caused due to an error within the server when parsing a query string that is escaped with the "mysql_real_escape_string()" function. This can potentially be exploited in an environment that uses multi-byte character encoding to bypass SQL injection escaping."

Ответить | Правка | Наверх | Cообщить модератору

52. "bind"  +1 +/
Сообщение от ivan1986email (?), 17-Июн-10, 11:59 
Вы только что доказали, что вы "Аналитик с лора"

Тоесть вы предлагаете экранировать самому - в результате допустить еще неизвестно какие баги, но жутко бояться уже пофикшенного давным давно бага.

SQL injection vulnerability in MySQL 4.1.x before 4.1.20 and 5.0.x before 5.0.22

Аналитик, такой аналитик.

Ответить | Правка | Наверх | Cообщить модератору

55. "bind"  +1 +/
Сообщение от Аноним (-), 17-Июн-10, 12:17 
Я предлагаю не испытывать излишнего доверия к "черным ящикам", так как в этом лишнем звене могут быть дыры. Если пользователи "mysql_real_escape_string()" увидят появление узявимости, то пользователи вашего черного ящика могут догадаться о ней только по косвенным признакам или после аудита кода. И не факт, что дыру в "черном ящике" автор исправит на следующий день, она может годами висеть незамеченной.

PS. Вы скатились до личных оскорблений, не имея аргументов для возражения. Посему считаю дискуссию законченной.

Ответить | Правка | Наверх | Cообщить модератору

57. "bind"  +/
Сообщение от ivan1986email (?), 17-Июн-10, 12:34 
Понятно, позиция называется - пишем на ассемблере все.

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

Излишнего доверия к "черным ящикам" никто не испытывает, более того код тут открыт, и даже пару багов было найдено и исправлено.

Стандартный функционал mysql_* функций совершенно не подходит, поэтому и была изначально написана эта библиотека, потом появился php5 с PDO, функциональность которого была лучше, но тоже не совсем устраивала, но для него был написан адаптер, который использует эту функциональность.

Вот если PDO или что-то еще разовьется до того уровня, чтобы предоставить аналогичную функциональность, то тогда эта библиотека будет не нужна, вот только когда это будет, и будет ли вообще :)

Оскорблений не было, это констатация факта :)

Ответить | Правка | Наверх | Cообщить модератору

63. "bind"  +/
Сообщение от Аноним (-), 17-Июн-10, 13:11 
>Вы сейчас несете чушь - использование стандартных функций там, где можно -
>лучше, чем писать свои, которые реализуют ту-же самую функциональность.

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

>Если исправят баг в основной, то баг исправится и тут,

Если автор левой библиотеки, которой пользуются 10 человек, не забросит свой проект. Посмотрите последние обновления безопасности в RHEL, там поправили дыры годичной давности,
как раз в библиотеках, подобных вашей.

>Стандартный функционал mysql_* функций совершенно не подходит, поэтому и была изначально написана
>эта библиотека, потом появился php5 с PDO, функциональность которого была лучше,

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

Ответить | Правка | Наверх | Cообщить модератору

65. "bind"  +/
Сообщение от ivan1986email (?), 17-Июн-10, 13:22 
Нет, я как раз предлагаю использовать стандартные функции - в случае mysql - mysql_real_escape_string, в случае PDO - PDO::escape, а вы тут ругаетесь на то что раз она бажная, то нужно написать свою обертку.

>Вот и надо было продвигать идеи в mainstream, а не создавать левый проект

Вы пробовали что-то продвинуть в mainstream? У меня есть опыт - и патчи psi+ в psi очень медленно, и в taglib довольно долго патч в пакет добавляется.

А тут вы хотите изменить идеологию работы PDO - подумайте, сколько геморроя это доставит.
Насчет десятка человек - dklab.ru довольно известный сайт среди русских php разработчиков, довольно популярная библиотека.

Ответить | Правка | Наверх | Cообщить модератору

70. "bind"  +/
Сообщение от Аноним (-), 17-Июн-10, 14:15 
>Вы пробовали что-то продвинуть в mainstream?

Я пробовал принимать в mainstream :-)


Ответить | Правка | К родителю #65 | Наверх | Cообщить модератору

87. "bind"  +/
Сообщение от Sw00p aka Jeromemail (?), 17-Июн-10, 20:48 
Release Date        2006-06-02
Ответить | Правка | К родителю #50 | Наверх | Cообщить модератору

67. "bind"  +/
Сообщение от Аноним (-), 17-Июн-10, 13:47 
Не вижу проблем писать код вида (псевдокод):
$conn->query("SELECT * FROM table WHERE fname='".$conn->quote($fname)."'";

Меня ни разу не обламывает экранировать переменные. Хотя, тут больше приходятся полагаться на внимание разработчика. Но, неужели сложно экранировать ВСЕ переменные, если нет уверенности в разработчике? Просто принять это как договорённость при разаработке проекта. А за неэкранированные больно бить по гениталиям.

ИМХО, компактней, чем bind. Но о вкусах не спорят. ) Bind тоже катит. )

Ответить | Правка | К родителю #14 | Наверх | Cообщить модератору

75. "bind"  +/
Сообщение от Cobold (??), 17-Июн-10, 16:13 
вот тут-то как раз собака и порылась - если использовать биндинг то параметры всегда экранированы, совсем без участия разработчика, а если полагаться на экранирование "по ходу", то разработчик постоянно должен об этом думать (будто ему больше заняться нечем). В проекте с тысячами запросов это просто нереально, будь программисты хоть абсолютные педанты, кто угодно может забыть или просмотреть что-то. И случается это часто как раз в таких местах где визуально не сразу и заметишь, так что полагаться на то что другие коллеги обнаружат тоже нельзя. Поэтому такие дыры лучше ищутся автоматизированно, но тогда это уже аудит называется и стоит отдельно. Или жить с риском что кто-нибудь сделает это за тебя, но только тогда этот кто-то может отверстием сразу и попользоваться. А оно надо, весь этот гемморой?
Ответить | Правка | Наверх | Cообщить модератору

79. "bind"  +/
Сообщение от ivan1986email (?), 17-Июн-10, 16:42 
Да, все правильно.
По сути этоиу правилу удовлетворяет PDO, а симпла, про которую я писал выше - это доведенное до нормального интерфейса PDO.
Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру