Pull to refresh

Comments 20

Скорее DoS, нежели DDoS. Все таки полезная нагрузка будет направлена самим на себя?
Или я неправильно понял? :X
немного попутал с определениями да. ну можно и distributed сделать для пущего эффекта
И всеже это не самим на себя. Просто достаточно 1 компьютера чтобы постепенно забить символами всю память
Или я неправильно понял? )
Сколько же потребуется сгенерировать трафика, чтобы забить память? Тут эффект от затраченных ресурсов на обработку запроса будет выше, чем от потерянной памяти на этих символах.

Ну вылез воркер по памяти за дозволенный порог — перезапустили его и нет проблем.
Можно, конечно, наблюдать за Symbol.all_symbols, но оно того не стоит.

Какой-либо ошибки здесь не вижу — все так, как и должно быть.
Для ruby- разработчика неплохое напоминание того, что не нужно без необходимости плодить неконтролируемые символы, когда можно обойтись строкой.
>Ну вылез воркер по памяти за дозволенный порог — перезапустили его и нет проблем.

ну нихрена себе нет проблем!
«пацаны у нас тут базу украли и таблицы дропнули!»
«ща из бекапов востановим и нет проблем»
Разве в 4 рельсах не выпилили сахар вроде find_by? Надо будет использовать where ручками.
Ещё непонятно зачем использовать Model.find_by_id()кода Model.find() и так по id ищет? Или это просто пример для наглядности?

Ну а вообще кто вам мешает написать такое:
Model.find(:all, conditions: ["id LIKE ?", "#{params[:id]}"])

или так
Model.where("id = ?", params[:id])
это первая половина поста. Там дальше написано
Весь этот SQL Injection CVE не стоит выеденного яйца! И ради чего пост? DoS!
Так я к тому и веду, если запрос будет Model.where("id = ?", params[:id]) и к нам придет symbol :all что то произойдет?
У меня ничего не происходит
User Load (0.3ms) SELECT "users".* FROM "users" WHERE (id = 'all')
all преобразуется в строку и возвращается пустой масив так как ничего не найдёно.
говорю прямо — то что мы щас обсуждаем херня и «не стоит выеденного яйца» относительно доса :) просто об этом была изначальная CVE
Не, то что вы написали имеет смысл, если используется Model.find(), а она судя по книгам и скринкастам используется повсеместно. Хотя в тех же книгах в первых же главах всегда пишут — «Не доверяйте всему, что приходит в приложение из вне...».

Поэтому если используется Model.find(), действительно если передать symbol :all из базы будут забираться все записи, что не очень хорошо.
Так что можно посоветовать как вариани переписать на Model.where(id: id), если не хочется отключать альтернативные парсеры?
ну это разные вещи. в первом случае надо бы .to_s приводить или .to_i например.

а парсеры надо отключать по совсем другой причине ДОС ОЛОЛО ВСЕ УМРЕМ
Отключить парсеры и получить не рабочий ajax и api?
Отключения парсеров не решение.
И в чём дос я так понять не могу. При использовании where или .to_s мы предотвращаем описываемую вами проблему.

Выше вы писали:
Просто достаточно 1 компьютера чтобы постепенно забить символами всю память

Но это как бы не правильно или я чего то не знаю?
В руби символы ссылаются на один и тот же кусок памяти если символ уже использовался и память выделилась в отличие от String

Попробуйте в irb
10.times do
    puts :all.object_id
end
тепло тепло уже совсем горячо :)
я удалил код для доса. :all тут не причем. генерируется куча :a1 :a2…
Ох, теперь всё понял. Руби действительно не удаляет символы позволяя тем самым использовать их повторно и более того ещё помещает их в dictionarySymbol.all_symbols

Я просто вцепился в sql injection и не понял сути второй части поста.

Как это раньше никто не обратил на это внимания?)
Действительно косяк, причём огромный:)
Спасибо за статью
Какой же это косяк? Это особенность символов, ради которых они, собственно, и были созданы. Они всегда в одном экземпляре и существуют в течении жизни приложения. За счет этого работают быстрее строк. Но и использовать их как строки нельзя. Т.е., например, нельзя использовать в пользовательском вводе #to_sym за избежанием зафлуживания символами.
Я имею ввиду, что это косяк рельсов. Зачем разрешать type="symbol" при передаче xml. Вообще зачем разрешать пользователю что то передавать в виде символов, Если я захочу что то за оптимизировать за счёт символов я всегда могу сделать .to_sym
Егор, тебе же никто не мешает закоммитить исправления :)

То есть как я понял приведение xml запроса с type=«symbol» к символу будет каждый раз ссылаться на тот же участок памяти и можно слать каждый раз все больше и больше?
Вы опечатались или не так поняли, как и я в начале. Автор имеет ввиду, что можно рендомно генерить symbol и посылать (каждый раз новый) через type="symbol", тем самым вынуждая выделять память под новый symbol. А так как они не отчищаются Garbage Collector, постепенно они забьют всю памать.
да, локальный инстанс набирает 2 гига памяти с пары запросов
Sign up to leave a comment.

Articles

Change theme settings