
Aplicação Rails Boba para demonstrar a vulnerabilidade CVE-2013-0156
== Bem-vindo ao Rails
Rails é um framework de aplicações web que inclui tudo o que é necessário para criar aplicações web com suporte a banco de dados de acordo com o padrão Modelo-Visão-Controle (MVC).
Esse padrão divide a visão (também chamada de apresentação) em templates "burros" que são responsáveis principalmente por inserir dados pré-construídos entre tags HTML. O modelo contém os objetos de domínio "inteligentes" (como Conta, Produto, Pessoa, Postagem) que detêm toda a lógica de negócio e sabem como persistir-se em um banco de dados. O controlador lida com as requisições de entrada (como Salvar Nova Conta, Atualizar Produto, Mostrar Postagem) manipulando o modelo e direcionando os dados para a visão.
No Rails, o modelo é tratado por uma camada de mapeamento objeto-relacional chamada Active Record. Essa camada permite que você apresente os dados de linhas do banco de dados como objetos e enriqueça esses objetos de dados com métodos de lógica de negócio. Você pode ler mais sobre o Active Record em link:files/vendor/rails/activerecord/README.html.
O controlador e a visão são tratados pelo Action Pack, que lida com ambas as camadas através de suas duas partes: Action View e Action Controller. Essas duas camadas são agrupadas em um único pacote devido à sua forte interdependência. Isso é diferente do relacionamento entre o Active Record e o Action Pack, que é muito mais separado. Cada um desses pacotes pode ser usado independentemente fora do Rails. Você pode ler mais sobre o Action Pack em link:files/vendor/rails/actionpack/README.html.
== Começando
No prompt de comando, crie uma nova aplicação Rails: rails new myapp (onde myapp é o nome da aplicação)
Mude para o diretório myapp e inicie o servidor web: cd myapp; rails server (execute com --help para opções)
Vá para http://localhost:3000/ e você verá: "Welcome aboard: You're riding Ruby on Rails!"
Siga as diretrizes para começar a desenvolver sua aplicação. Você pode encontrar os seguintes recursos úteis:
== Depurando o Rails
Às vezes sua aplicação dá errado. Felizmente, existem muitas ferramentas que ajudarão você a depurá-la e colocá-la de volta nos trilhos.
A primeira área a verificar são os arquivos de log da aplicação. Mantenha comandos "tail -f" em execução no server.log e no development.log. O Rails exibirá automaticamente informações de depuração e tempo de execução nesses arquivos. Informações de depuração também serão mostradas no navegador em requisições de 127.0.0.1.
Você também pode registrar suas próprias mensagens diretamente no arquivo de log a partir do seu código usando a classe logger do Ruby dentro de seus controladores. Exemplo:
class WeblogController < ActionController::Base def destroy @weblog = Weblog.find(params[:id]) @weblog.destroy logger.info("#{Time.now} Destroyed Weblog ID ##{@weblog.id}!") end end
O resultado será uma mensagem em seu arquivo de log como:
Mon Oct 08 14:22:29 +1000 2007 Destroyed Weblog ID #1!
Mais informações sobre como usar o logger estão em http://www.ruby-doc.org/core/
Além disso, a documentação do Ruby pode ser encontrada em http://www.ruby-lang.org/. Existem vários livros disponíveis online também:
Esses dois livros o deixarão atualizado sobre a linguagem Ruby e também sobre programação em geral.
== Depurador
O suporte ao depurador está disponível através do comando debugger quando você inicia seu servidor Mongrel ou WEBrick com --debugger. Isso significa que você pode interromper a execução em qualquer ponto do código, investigar e alterar o modelo, e então, retomar a execução! Você precisa instalar o ruby-debug para executar o servidor em modo de depuração. Com gems, use sudo gem install ruby-debug. Exemplo:
class WeblogController < ActionController::Base def index @posts = Post.all debugger end end
Então o controlador aceitará a ação, executará a primeira linha e então apresentará a você um prompt IRB na janela do servidor. Aqui você pode fazer coisas como:
@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"
...e ainda melhor, você pode examinar como seus objetos em tempo de execução realmente funcionam:
f = @posts.first => #<Post:0x13630c4 @attributes={"title"=>nil, "body"=>nil, "id"=>"1"}> f. Display all 152 possibilities? (y or n)
Finalmente, quando estiver pronto para retomar a execução, você pode digitar "cont".
== Console
O console é um shell Ruby, que permite que você interaja com o modelo de domínio da sua aplicação. Aqui você terá todas as partes da aplicação configuradas, exatamente como quando a aplicação está em execução. Você pode inspecionar modelos de domínio, alterar valores e salvar no banco de dados. Iniciar o script sem argumentos o lançará no ambiente de desenvolvimento.
Para iniciar o console, execute rails console a partir do diretório da aplicação.
Opções:
Para recarregar seus controladores e modelos após iniciar o console, execute reload!
Mais informações sobre o irb podem ser encontradas em: link:http://www.rubycentral.org/pickaxe/irb.html
== dbconsole
Você pode ir para a linha de comando do seu banco de dados diretamente através de rails dbconsole. Você estará conectado ao banco de dados com as credenciais definidas em database.yml. Iniciar o script sem argumentos o conectará ao banco de dados de desenvolvimento. Passar um argumento o conectará a um banco de dados diferente, como rails dbconsole production. Atualmente funciona para MySQL, PostgreSQL e SQLite 3.
== Descrição dos Conteúdos
A estrutura de diretórios padrão de uma aplicação Ruby on Rails gerada:
|-- 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 Contém todo o código específico para esta aplicação em particular.
app/assets Contém subdiretórios para imagens, folhas de estilo e arquivos JavaScript.
app/controllers Contém controladores que devem ser nomeados como weblogs_controller.rb para mapeamento automático de URL. Todos os controladores devem descender de ApplicationController, que por sua vez descende de ActionController::Base.
app/models Contém modelos que devem ser nomeados como post.rb. Os modelos descendem de ActiveRecord::Base por padrão.
app/views Contém os arquivos de template para a visão que devem ser nomeados como weblogs/index.html.erb para a ação WeblogsController#index. Todas as visões usam sintaxe eRuby por padrão.
app/views/layouts Contém os arquivos de template para layouts a serem usados com as visões. Isso modela o método comum de cabeçalho/rodapé para envolver as visões. Em suas visões, defina um layout usando layout :default e crie um arquivo chamado default.html.erb. Dentro de default.html.erb, chame <% yield %> para renderizar a visão usando este layout.
app/helpers Contém helpers de visão que devem ser nomeados como weblogs_helper.rb. Estes são gerados automaticamente para você ao usar geradores para controladores. Helpers podem ser usados para encapsular funcionalidades para suas visões em métodos.
config Arquivos de configuração para o ambiente Rails, o mapa de roteamento, o banco de dados, e outras dependências.
db Contém o esquema do banco de dados em schema.rb. db/migrate contém toda a sequência de Migrations para seu esquema.
doc Este diretório é onde a documentação da sua aplicação será armazenada quando gerada usando rake doc:app
lib Bibliotecas específicas da aplicação. Basicamente, qualquer tipo de código personalizado que não pertence a controladores, modelos ou helpers. Este diretório está no caminho de carga (load path).
public O diretório disponível para o servidor web. Também contém os despachantes (dispatchers) e os arquivos HTML padrão. Isto deve ser definido como DOCUMENT_ROOT do seu servidor web.
script Scripts auxiliares para automação e geração.
test Testes unitários e funcionais juntamente com fixtures. Ao usar o comando rails generate, arquivos de teste de modelo serão gerados para você e colocados neste diretório.
vendor Bibliotecas externas das quais a aplicação depende. Também inclui o subdiretório plugins. Se a aplicação tiver rails congelados (frozen), essas gems também vão aqui, sob vendor/rails/. Este diretório está no caminho de carga (load path).