metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2012-02-07 12:12 pm

Special Olympics - айсед в рантайме

скриншот
Полудневное (поверхностное) вздрючивание айседного приложения как средствами собственно веб-морды, так и wget и редактированием конфига нашло только несколько мелких багов, типа "приложение показывает 500 Server error если указать кривой url".
Еще один мелкий баг был - редактирование конфига отчетов привело к незапускаемости rails s вообще, с диким стек-трейсом.
После исправления практически все кривые запросы напрямую к json-сервис показывали 403.
Ошибки в конфиге отчетов пишутся в лог сервиса.

Еще один крайне спорный момент: обработка параметров запроса:

      @sql.scan(/\?\w+/).each do |name|
        real_name = name[1 .. -1].downcase
        parameter = @parameters.find { |p| p.name == real_name }
        value = ActiveRecord::Base.sanitize(parameters[@parameters.index(parameter)])
        expanded_sql.sub!(name, value)
      end


[livejournal.com profile] theiced не использует препаред статементы,а вместо этого заменяет параметры регэкспом, а их значения обрабатывает ActiveRecord::Base.sanitize. Т.е. если мы верим либе - то у нас sql-injection не будет. Айсед утверждает, что у них так принято, хотя я всегда считал что единственно кошерный вариант - это препаред статементы и обработка переменных-параметров сервером.

Это решение, кстати, делает невалидными(не грузит их) такого рода sql-запросы:
select *,'?somestring' from test where stringval like ?stringval and boolval=?boolval
т.к. ?somestring оно считает параметром, хотя он очевидно не параметр, а литерал

[identity profile] artureg.livejournal.com 2012-02-07 09:23 am (UTC)(link)
айсед как всегда закатывал солнце руками

[identity profile] sorhed.livejournal.com 2012-02-07 09:50 am (UTC)(link)
> не использует препаред статементы,а вместо этого заменяет параметры регэкспом, а их значения обрабатывает ActiveRecord::Base.sanitize

Всегда знал, что Rails — это такой PHP-переросток.

[identity profile] veter-r-r.livejournal.com 2012-02-07 10:10 am (UTC)(link)
В 21-м веке не пользоваться prepared statements? Такое еще осталось?

[identity profile] guamoka.livejournal.com 2012-02-07 10:10 am (UTC)(link)
Графоманство.

[identity profile] devnu11.livejournal.com 2012-02-07 10:17 am (UTC)(link)
(iced_mode)
ви ничего не понимаете, prepared statements - анальный кал, и используют его только нищеброды с xml-ем головного мозга
(/iced_mode)
Edited 2012-02-07 10:18 (UTC)

[identity profile] falcrum.livejournal.com 2012-02-07 10:18 am (UTC)(link)
Замена параметров значениями плоха ещё и потому (я бы даже сказал, в первую очередь - потому), что sql-сервер не закэширует план запроса, а каждый раз будет строить его по новой.

[identity profile] blackyblack.livejournal.com 2012-02-07 11:10 am (UTC)(link)
Неиспользование препаредов не так уж и страшно. Если в тексте запросов гарантированно вопросительные знаки не встречаются и оптимизация по быстродействию запросов не проводилась, то и фиг с ним. Хуже то, что когда одно из этих условий перестанет выполняться, то придется всё-таки переходить на параметры и переписывать весь код (тут вроде достаточно локализовано формирование запросов, но с параметрами может внезапно стать сложнее).

[identity profile] theiced.livejournal.com 2012-02-07 11:23 am (UTC)(link)
плюсы такого подхода:

- мы видим сикль в логах. целый запрос а не анальное говно с вопросиками и вагоном параметров в жопе.

минусы:

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

------

теперь пусть дурачки пизданувшие про закаты солнца вручную (artureg, sorhed, veter_r_r, falcrum) приведут воспроизводимые замеры где препаред стэйтменты дают более 10% перфоманса или возьмут мой мозолистый хуец в свой нежный ротик и начнут сосать причмокивая.

ещё раз - можно были спокойно взять ruby-dbi и использовать те самые преп стэйтменты (код даже было бы на пару строк меньше), но оно плохо, см. выше.

[identity profile] theiced.livejournal.com 2012-02-07 11:30 am (UTC)(link)
далее, в приличном обществе никто никогда не исполняет живой сикль. у нас есть адекватные ормы, которыми можно пользоваться. в отличие от.

[identity profile] denisioru.livejournal.com 2012-02-07 11:38 am (UTC)(link)
Замена параметров регекспами - пиздец же. Школота на php.