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] permea-kra.livejournal.com 2012-02-07 11:47 am (UTC)(link)
Ээээ. Отчет из, например, 20 Gb базы на ОРМ руби ? Ви таки делаете мне смешно.

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

[identity profile] permea-kra.livejournal.com 2012-02-07 12:19 pm (UTC)(link)
И что, они все базу через себя пропускают? как это сделано?

[identity profile] theiced.livejournal.com 2012-02-07 12:32 pm (UTC)(link)
то есть если вы хотите что бы я вам вот сделал отчётик на ормах, пожалуйста. мой рейт для разовой работы $55/h на текущий момент.

[identity profile] permea-kra.livejournal.com 2012-02-07 01:03 pm (UTC)(link)
А как иначе-то? Т.е. сделать отчет не полный, в котором из 2 ТБ рабочих данных для отчета 1 МБ наверняка можно. Для полного отражения запросов из ОРМ на базу этот орм должен знать все про субдешечку. Этого даже про разработчиков СУБД сказать нельзя.

[identity profile] theiced.livejournal.com 2012-02-07 01:39 pm (UTC)(link)
ормы в рубях умные. они дохуя-дохуя чего умеют. хотите посмотреть на практике - платите денюжку ;]

Не, понятно, что если ормы использовать в индо-ортуро-стайле:

Customer.find(:all).each do |c|
  c.products.each { |p| add_to_report(p, p.customer) }
end


то ничего хорошего из этого не выйдет.