Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет mumuntu ([info]mumuntu)
@ 2011-04-29 05:38:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Сеанс разоблачения заблуждений и суеверий, связанных с SQL injections в PHP, таких, как:

- что искейпинг нужен для входящих данных
- что mysql_real_escape_string - это универсальная защита от инъекций, делает "вредные" символы "безопасными".
- что mysql_real_escape_string вообще имеет какое-то отношение к защите от инъекций.
- что mysql_real_escape_string "принимает во внимание текущую кодировку". и поэтому она лучше, чем addslashes()
- что препареды - защита от всего, silver bullet
- что препареды "быстрее".
- что препареды "безопаснее", чем искейпинг (спорное, в принципе, утверждение, но в целом...)
- что при использовании препаредов искейпингом занимается база
- что запрос из комикса про мальчика Bobby Tables сможет нанести хоть какой-то вред стандартному PHP/MySQL приложению.

А так же рекомендации по организации правильного подхода к динамическому составлению запросов.
[...]

Я без хелпа не знаю, что такое функция mysql_real_escape_string, но, видимо, что-то крутое, раз ей посвящена половина программы.
Но вот на SQL injection, выполненный при помощи prepared query, я бы, наверное, хотел посмотреть.
Или я неправильно понял, о чем собирается докладывать коллега.


(Добавить комментарий)


[info]alexclear@lj
2011-04-28 22:01 (ссылка)
Слушайте, они же за это вроде как еще и деньги берут.
Ну, как обычно.
Жаль, я хотел бы присутствовать на этом докладе.
Очень беспокоюсь за схватку "искейпинга" с "препаредами" - а вдруг препареды таки победят? Это что ж тогда будет?
Интересно, нет ли у коллеги аккаунта в ЖЖ, например.

(Ответить) (Ветвь дискуссии)


[info]wizzard0@lj
2011-04-28 23:46 (ссылка)
> Слушайте, они же за это вроде как еще и деньги берут.

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

А тут человек вроде как, гм, накопил экспу, и хочет ею поделиться. Другой вопрос, что до систематизации, или, например, чтения мануалов - он так и не дошел :)

(Ответить) (Уровень выше)


(Анонимно)
2011-04-29 07:36 (ссылка)
> Интересно, нет ли у коллеги аккаунта в ЖЖ, например.

http://phorror.livejournal.com
или здесь http://phpclub.ru/talk/threads/%D0%BF%D1%80%D0%BE-%D0%B8%D0%BD%D1%8A%D0%B5%D0%BA%D1%86%D0%B8%D0%B8-%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B5%D1%81%D0%BD%D0%BE-%D0%BB%D0%B8.67907/

(Ответить) (Уровень выше)


[info]phorror@lj
2011-04-29 09:25 (ссылка)
есть

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]alexclear@lj
2011-04-29 09:33 (ссылка)
Круто.
Я просто хотел узнать, а от какого же типа инъекций не защищают prepared statements.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]phorror@lj
2011-04-29 09:35 (ссылка)
prepared statements работают только с данными.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]alexclear@lj
2011-04-29 09:38 (ссылка)
Стоп, это же моя фраза.
Совершенно верно, prepared statements работают только с данными.
Я бы даже сказал так - к моменту подстановки данных в запрос его разбор уже завершен.
В связи с этим, никакой sql injection невозможен по определению.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]phorror@lj
2011-04-29 09:44 (ссылка)
Но составляя запрос, мы не всегда работаем только с данными. Иногда приходится динамически подставлять идентификаторы.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]alexclear@lj
2011-04-29 09:50 (ссылка)
Я себе не представляю ситуации, в которой мне или другому гетеросексуалу придет в голову динамически составлять запрос, используя в качестве его частей данные, введенные пользователем.
Более того, в данной ситуации не нужен никакой эскейпинг вообще, нужен паттерн мэтчинг, пусть пользователь вводит, что хочет, лишь бы мы могли сопоставить этим данным заранее определенную ветку в алгоритме сборки запроса.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]phorror@lj
2011-04-29 11:42 (ссылка)
Ну, Котеров, к примеру, именно искейпит идентификаторы в своей dbSimple.
И его можно понять - искейпинг всегда проще валидации. Выстрелил-и-забыл.
Но такой подход при некорректном идентификаторе будет вызывать ошибку запроса, поэтому полагаться только на него мне кажется неправильным, так что я тоже за мэтчинг.

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

В любом случае, вопрос был не о решении проблемы, а о её постановке. Пример я привёл :)

Про путь интересно.
Он мне кажется прямым: привожу пример, когда prepared statements не работают, и показываю, как поступать в таких случаях.

(Ответить) (Уровень выше)


[info]alexclear@lj
2011-04-29 09:51 (ссылка)
То есть, я понял, что Вы имеете в виду, но мне кажется, что сам по себе путь, приводящий к подобным решениям с их проблемами - неправильный.

(Ответить) (Уровень выше)


[info]awind@lj
2011-04-29 10:02 (ссылка)
prepare("SELECT * FROM users WHERE name = $name")
никогда не видел? тогда ты живёшь в идеальном мире.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]alexclear@lj
2011-04-29 10:04 (ссылка)
Видел, конечно.
Но сам такое не пишу - это ужасно же.

(Ответить) (Уровень выше)


[info]phorror@lj
2011-04-29 10:49 (ссылка)
на самом деле это не так уж смешно.
как я отметил выше, альтернативу prepare("SELECT * FROM users ORDER BY `$colname`")
придумать трудно.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]dil@lj
2011-04-29 13:59 (ссылка)
Главное - не брать этот $colname из данных, полученных от пользователя :)

(Ответить) (Уровень выше)


[info]awind@lj
2011-04-29 14:54 (ссылка)
а как, простите, одно с другим связано? можно, конечно, попросить пользователя ввести в формочку название поля, но чем это кончается даже большинство студентов знает.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]phorror@lj
2011-04-29 17:32 (ссылка)
Не, ну при чем здесь пользователи? :)
Мы говорили о запросах.
Конкретно этот являет нам пример случая, когда даже при наличии prepare переменная в запросе является не головотяпством, а необходимостью.

сортировку, кстати, удобнее не в формочку вводить, а гетом передавать.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]kurilka@lj
2011-04-29 17:51 (ссылка)
а формочки не только постом приходят...

(Ответить) (Уровень выше)


[info]awind@lj
2011-04-30 02:57 (ссылка)
мы говорили об sql injection. или злобный хакер, добравшийся до кода, будет тонко издеваться над конструктором запросов вместо того чтобы просто написать свой?

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]phorror@lj
2011-04-30 03:35 (ссылка)
а злобный хакер здесь при чём? :)
prepare("SELECT * FROM users ORDER BY `$colname`") пишет не хакер, а программист.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]awind@lj
2011-05-01 16:14 (ссылка)
при том что injection сам по себе не случается.

и я так пишу. но sql injection не происходит. surprise?

(Ответить) (Уровень выше)


[info]novosteycom@lj
2011-04-28 22:32 (ссылка)
а SQL injection, выполненный при помощи prepared query, я бы, наверное, хотел посмотреть.
+1 :)

(Ответить) (Ветвь дискуссии)


[info]wizzard0@lj
2011-04-28 23:41 (ссылка)
С помощью непараметризованной хранимки - за милую душу. Дело-то не в хранимках и не в эскейпах, а в том что ОБЫЧНО в хранимках параметры подставляются отдельно, но есть целая куча народу которая уверена, что если конкатенировать, а потом сделать prepare - то угроза иньекта исчезнет >_>

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

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

(Ответить) (Уровень выше)


[info]dil@lj
2011-04-29 04:31 (ссылка)
Да легко. Формируем запрос из строки, предоставленной пользователем, prepare, execute.
Похоже, товарищ не различает prepared query и binding в них.

(Ответить) (Уровень выше)


[info]max630@lj
2011-04-29 00:09 (ссылка)
> искейпинг нужен для входящих данных

насколько я понимаю, он хочет сказать что надо искейпить все данные

> препареды "быстрее"

это, наверное, зависит от реализации?

> запрос из комикса про мальчика Bobby Tables сможет нанести хоть какой-то вред стандартному PHP/MySQL приложению

вот это кстати да. mysql_exec (или как его там) в PHP берёт 1 выражение, то есть буквально тот запрос не прокатит, он сругнётся на ";"

(Ответить) (Ветвь дискуссии)


[info]alexclear@lj
2011-04-29 05:39 (ссылка)
насколько я понимаю, он хочет сказать что надо искейпить все данные

А, наверное.

это, наверное, зависит от реализации?

Ну здесь он прав, во-первых, они не быстрее, во-вторых, есть ситуации, в которых они еще и медленнее.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]dil@lj
2011-04-29 06:17 (ссылка)
Если запрос выполняется один раз, то prepare+execute будет медленнее, естественно.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]alexclear@lj
2011-04-29 06:21 (ссылка)
Я другое имел в виду - если в колонке распределение значений неравномерно, у prepared query план запроса может получаться хуже.
Но MySQL, вроде, вообще плевать хотел на такие тонкости, он не собирает и не учитывает статистику по колонке.

(Ответить) (Уровень выше)


[info]awind@lj
2011-04-29 02:01 (ссылка)
а биндинга в вашей похапени нет? или это как-то по другому называется?

(Ответить) (Ветвь дискуссии)


[info]dil@lj
2011-04-29 04:30 (ссылка)
есть в отдельном модуле по имени mysqli

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]awind@lj
2011-04-29 05:23 (ссылка)
но нормальный студент до него документацию дочитать не способен?

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]dil@lj
2011-04-29 06:17 (ссылка)
Да вы что, кто ж документацию-то читает..

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]awind@lj
2011-04-29 08:42 (ссылка)
и автор мегастатьи "социальная сеть за 15 минут" тоже.

(Ответить) (Уровень выше)


[info]dil@lj
2011-04-29 08:33 (ссылка)
вот так оне и пишуть... http://ru-php.livejournal.com/1528278.html

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]awind@lj
2011-04-29 12:37 (ссылка)
ну вот, спугнули :(

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]dil@lj
2011-04-29 12:38 (ссылка)
У меня копия есть, если что: http://dil.livejournal.com/1007678.html

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]proforg@lj
2011-04-29 12:39 (ссылка)
всё ок с записью :)

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]dil@lj
2011-04-29 12:39 (ссылка)
Access is denied.
You do not have access rights to view this entry.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]proforg@lj
2011-04-29 12:41 (ссылка)
ну так только для ценителей!
а вы к ним, видимо, не относитесь.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]dil@lj
2011-04-29 12:44 (ссылка)
всем спасибо, все свободны (http://blogs.yandex.ru/commentcopy.xml?f=af080e75f83ae3cbd5ee46ad6669ccd0&m=http%3A%2F%2Fru-php.livejournal.com%2F1528278.html%3Fthread%3D22902486&q=K3icY2RgBEIQYAJjNyDJBuY7MjAxwiU5IZJsxalFZalFAko5mWWpWfmlRXmJOXrJ%2BbkMELDjwLLfrAwMjAh9LBiGIkli2siKYSN7WmpqSnxmCoeSmbGpgYWRGapVDJwwcSWQhhBGBiTg5uYINJNT11DPAAwYcJrOpmRqZGRhiWY2O0RUiZ0CkzmUjIzMDQ0tDDDcDRWnyN2cSsbmFhZmlsYmaMZzwSWUuCgwn0vJ0MDE2MTY0MgYzQJuhIwSN2EbWCDizECGG1FMRqgIkBZET21KgmR4iTm3uFhcKTTSwMfV19U90jjcwt2w0CQjMqBAPx3NbxI4lClJEGMvhj8AUOBviQ%3D%3D)

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]proforg@lj
2011-04-29 12:47 (ссылка)
Ох, а он ещё и сегодняшний к тому же!
Красота да и только :)

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

(Ответить) (Уровень выше)


[info]phorror@lj
2011-04-29 17:30 (ссылка)
можно вступить в сообщество, и станет видно.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]awind@lj
2011-04-30 02:27 (ссылка)
но зачем?

(Ответить) (Уровень выше)


[info]dil@lj
2011-04-30 05:38 (ссылка)
а меня что, оттуда исключили?

(Ответить) (Уровень выше)


[info]rainman_rocks@lj
2011-04-29 04:04 (ссылка)
Я думаю, препареды мешают "самовыражаться в коде".

(Ответить)


[info]dil@lj
2011-04-29 04:36 (ссылка)
И ещё было бы интересно задать товарищу вопрос про вторичную инъекцию..
Это когда данные, первоначально полученные от пользователя, искейпятся и успешно записываются в базу, а потом, когда они берутся обратно из базы - не искейпятся. Вот тут-то Bobby Tables и срабатывает.

(Ответить) (Ветвь дискуссии)


[info]phorror@lj
2011-04-29 09:26 (ссылка)
это первый пункт.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]dil@lj
2011-04-29 09:29 (ссылка)
Данные из базы - они как бы уже не очень входящие, хотя это вопрос терминологии.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]phorror@lj
2011-04-29 09:34 (ссылка)
об этом и речь.

(Ответить) (Уровень выше)


(Анонимно)
2011-04-29 05:03 (ссылка)
php сосёт, mysql сосёт

(Ответить) (Ветвь дискуссии)


[info]alexclear@lj
2011-04-29 05:40 (ссылка)
Ага, а смерть неизбежна.

(Ответить) (Уровень выше)


[info]vromanov@lj
2011-04-29 05:52 (ссылка)
мы на препейдах получаем ускорение в 100 раз. Но у нас не php и не mysql

(Ответить) (Ветвь дискуссии)


[info]proforg@lj
2011-04-29 06:12 (ссылка)
да, я тоже замечал что предоплаченные дешевле.
не на 2 порядка, но

(Ответить) (Уровень выше)


[info]max630@lj
2011-04-29 06:04 (ссылка)
чего тру PHP-шники действительно не понимают - это концепции fail early вообще и типов в частности. Помню в ru_php долго обсуждали, как же правильно "искейпить" числа. Договорились, по-моему, до того что к ним надо + 0 приписывать.

(Ответить) (Ветвь дискуссии)


[info]uznick@lj
2011-04-29 08:11 (ссылка)
там же, блин, приведение типов есть.

(Ответить) (Уровень выше)


[info]vosi@lj
2011-04-29 22:22 (ссылка)
4я неделя на питоне
смеюсь с проблем похапе
удивляюсь простоте, гибкости и скорости разработки на питоне

(Ответить) (Ветвь дискуссии)


[info]dil@lj
2011-04-30 05:47 (ссылка)
У питона тоже есть свои заморочки. Но таки да, порог вхождения куда выше, поэтому и ляпов получается гораздо меньше.

(Ответить) (Уровень выше)