
Rails-приложение Silly для демонстрации уязвимости CVE-2013-0156
== Добро пожаловать в Rails
Rails — это фреймворк для веб-приложений, который включает всё необходимое для создания веб-приложений на основе базы данных в соответствии с шаблоном Model-View-Control.
Этот шаблон разделяет представление (view, также называемое presentation) на «глупые» шаблоны, которые в первую очередь отвечают за вставку заранее подготовленных данных между HTML-тегами. Модель содержит «умные» доменные объекты (такие как Account, Product, Person, Post), которые хранят всю бизнес-логику и умеют сохранять себя в базу данных. Контроллер обрабатывает входящие запросы (такие как Save New Account, Update Product, Show Post), управляя моделью и направляя данные в представление.
В Rails за модель отвечает так называемый уровень объектно-реляционного отображения под названием Active Record. Этот уровень позволяет вам представлять данные из строк базы данных в виде объектов и дополнять эти объекты данных методами бизнес-логики. Подробнее об Active Record можно прочитать в link:files/vendor/rails/activerecord/README.html.
За контроллер и представление отвечает Action Pack, который обрабатывает оба уровня с помощью двух своих частей: Action View и Action Controller. Эти два уровня объединены в единый пакет из-за их сильной взаимозависимости. Это не похоже на отношения между Active Record и Action Pack, которые гораздо более обособлены. Каждый из этих пакетов можно использовать независимо за пределами Rails. Подробнее об Action Pack можно прочитать в link:files/vendor/rails/actionpack/README.html.
== Начало работы
В командной строке создайте новое приложение Rails: rails new myapp (где myapp — имя приложения)
Перейдите в каталог myapp и запустите веб-сервер: cd myapp; rails server (запустите с --help для просмотра опций)
Перейдите по адресу http://localhost:3000/, и вы увидите: "Welcome aboard: You're riding Ruby on Rails!"
Следуйте инструкциям, чтобы начать разработку своего приложения. Вам могут пригодиться следующие ресурсы:
== Отладка Rails
Иногда ваше приложение работает неправильно. К счастью, существует множество инструментов, которые помогут вам отладить его и вернуть на рельсы.
Первое, что стоит проверить, — это файлы журналов приложения. Держите команды «tail -f» запущенными для server.log и development.log. Rails будет автоматически записывать в эти файлы отладочную информацию и сведения о времени выполнения. Отладочная информация также будет отображаться в браузере для запросов с адреса 127.0.0.1.
Вы также можете записывать собственные сообщения непосредственно в файл журнала из своего кода, используя класс logger в Ruby внутри ваших контроллеров. Пример:
class WeblogController < ActionController::Base def destroy @weblog = Weblog.find(params[:id]) @weblog.destroy logger.info("#{Time.now} Destroyed Weblog ID ##{@weblog.id}!") end end
В результате в вашем файле журнала появится сообщение примерно такого вида:
Mon Oct 08 14:22:29 +1000 2007 Destroyed Weblog ID #1!
Дополнительную информацию об использовании logger можно найти по адресу http://www.ruby-doc.org/core/
Кроме того, документацию по Ruby можно найти по адресу http://www.ruby-lang.org/. Также в интернете доступно несколько книг:
Эти две книги помогут вам быстро освоить язык Ruby, а также программирование в целом.
== Отладчик
Поддержка отладчика доступна через команду debugger, если запустить сервер Mongrel или WEBrick с флагом --debugger. Это означает, что вы можете прервать выполнение в любой точке кода, исследовать и изменить модель, а затем возобновить выполнение! Для запуска сервера в режиме отладки необходимо установить ruby-debug. При использовании gems выполните sudo gem install ruby-debug. Пример:
class WeblogController < ActionController::Base def index @posts = Post.all debugger end end
Таким образом, контроллер примет действие, выполнит первую строку, а затем предоставит вам приглашение IRB в окне сервера. Здесь вы можете делать, например, следующее:
@posts.inspect => "[#<Post:0x14a6be8 @attributes={"title"=>nil, "body"=>nil, "id"=>"1"}>, #<Post:0x14a6620 @attributes={"title"=>"Rails", "body"=>"Only ten..", "id"=>"2"}>]" @posts.first.title = "hello from a debugger" => "hello from a debugger"
...и, что ещё лучше, вы можете изучить, как на самом деле работают ваши объекты во время выполнения:
f = @posts.first => #<Post:0x13630c4 @attributes={"title"=>nil, "body"=>nil, "id"=>"1"}> f. Display all 152 possibilities? (y or n)
Наконец, когда вы будете готовы возобновить выполнение, вы можете ввести «cont».
== Консоль
Консоль — это оболочка Ruby (shell), которая позволяет вам взаимодействовать с доменной моделью вашего приложения. Здесь у вас будут сконфигурированы все части приложения, точно так же, как и при запущенном приложении. Вы можете исследовать доменные модели, изменять значения и сохранять их в базу данных. Запуск скрипта без аргументов запустит его в среде разработки.
Чтобы запустить консоль, выполните rails console из каталога приложения.
Опции:
Чтобы перезагрузить контроллеры и модели после запуска консоли, выполните reload!
Дополнительную информацию об irb можно найти по адресу: link:http://www.rubycentral.org/pickaxe/irb.html
== dbconsole
Вы можете перейти в командную строку вашей базы данных напрямую через rails dbconsole. Вы будете подключены к базе данных с учётными данными, определёнными в database.yml. Запуск скрипта без аргументов подключит вас к базе данных разработки. Передача аргумента подключит вас к другой базе данных, например rails dbconsole production. В настоящее время работает с MySQL, PostgreSQL и SQLite 3.
== Описание содержимого
Структура каталогов по умолчанию сгенерированного приложения Ruby on Rails:
|-- app
| |-- assets
| |-- images
| |-- javascripts
| -- stylesheets | |-- controllers | |-- helpers | |-- mailers | |-- models | -- views
| -- layouts |-- config | |-- environments | |-- initializers | -- locales
|-- db
|-- doc
|-- lib
| -- tasks |-- log |-- public |-- script |-- test | |-- fixtures | |-- functional | |-- integration | |-- performance | -- unit
|-- tmp
| |-- cache
| |-- pids
| |-- sessions
| -- sockets -- vendor
|-- assets
-- stylesheets -- plugins
app Содержит весь код, относящийся именно к этому приложению.
app/assets Содержит подкаталоги для изображений, таблиц стилей и JavaScript-файлов.
app/controllers Содержит контроллеры, которые должны называться наподобие weblogs_controller.rb для автоматического сопоставления URL. Все контроллеры должны наследоваться от ApplicationController, который, в свою очередь, наследуется от ActionController::Base.
app/models Содержит модели, которые должны называться наподобие post.rb. По умолчанию модели наследуются от ActiveRecord::Base.
app/views Содержит файлы шаблонов для представления, которые должны называться наподобие weblogs/index.html.erb для действия WeblogsController#index. По умолчанию все представления используют синтаксис eRuby.
app/views/layouts Содержит файлы шаблонов для макетов, используемых с представлениями. Так реализуется распространённый метод обрамления представлений верхним и нижним колонтитулами. В своих представлениях определите макет с помощью layout :default и создайте файл с именем default.html.erb. Внутри default.html.erb вызовите <% yield %>, чтобы отобразить представление с использованием этого макета.
app/helpers Содержит хелперы представлений, которые должны называться наподобие weblogs_helper.rb. Они генерируются автоматически при использовании генераторов для контроллеров. Хелперы можно использовать, чтобы оформить функциональность ваших представлений в виде методов.
config Файлы конфигурации для среды Rails, карты маршрутов, базы данных и других зависимостей.
db Содержит схему базы данных в schema.rb. Каталог db/migrate содержит всю последовательность миграций для вашей схемы.
doc В этом каталоге будет храниться документация вашего приложения при её генерации с помощью rake doc:app
lib Библиотеки, специфичные для приложения. По сути, любой пользовательский код, который не относится к контроллерам, моделям или хелперам. Этот каталог находится в пути загрузки (load path).
public Каталог, доступный для веб-сервера. Также содержит диспетчеры и файлы HTML по умолчанию. Он должен быть установлен как DOCUMENT_ROOT вашего веб-сервера.
script Вспомогательные скрипты для автоматизации и генерации.
test Модульные и функциональные тесты, а также фикстуры. При использовании команды rails generate для вас будут сгенерированы шаблонные тестовые файлы и помещены в этот каталог.
vendor Внешние библиотеки, от которых зависит приложение. Также включает подкаталог plugins. Если в приложении используется замороженный Rails (frozen rails), эти гемы также размещаются здесь, в каталоге vendor/rails/. Этот каталог находится в пути загрузки (load path).