
CVE-2013-0156 の脆弱性を実証するための Silly Rails アプリ
== Rails へようこそ
Rails は、Model-View-Control パターンに従ってデータベースをバックエンドとする Web アプリケーションを作成するために必要なすべてを備えた Web アプリケーションフレームワークです。
このパターンでは、ビュー(プレゼンテーションとも呼ばれます)を、主に 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 Pack は、Action View と Action Controller の 2 つの部分で両方のレイヤーを処理します。これら 2 つのレイヤーは相互依存性が高いため、単一のパッケージにバンドルされています。これは、Active Record と Action Pack の関係がより分離されているのとは異なります。これらの各パッケージは、Rails の外部で独立して使用できます。Action Pack の詳細については、link:files/vendor/rails/actionpack/README.html を参照してください。
== はじめに
コマンドプロンプトで、新しい Rails アプリケーションを作成します: rails new myapp(myapp はアプリケーション名です)
myapp にディレクトリを変更し、Web サーバーを起動します: cd myapp; rails server(オプションは --help で確認できます)
http://localhost:3000/ にアクセスすると、次のように表示されます: "Welcome aboard: You're riding Ruby on Rails!"
ガイドラインに従ってアプリケーションの開発を開始してください。次のリソースが役立ちます:
== Rails のデバッグ
アプリケーションに問題が発生することがあります。幸いなことに、デバッグに役立ち、アプリケーションを Rails のレールに戻すためのツールが多数あります。
最初に確認すべきはアプリケーションのログファイルです。server.log と development.log で "tail -f" コマンドを実行したままにしてください。Rails はデバッグ情報と実行時情報をこれらのファイルに自動的に表示します。デバッグ情報は、127.0.0.1 からのリクエストではブラウザにも表示されます。
また、コントローラ内から Ruby の logger クラスを使用して、コードから独自のメッセージをログファイルに直接記録することもできます。例:
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/ にあります。オンラインで入手できる書籍もいくつかあります:
この 2 冊の書籍で、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 シェルで、アプリケーションのドメインモデルと対話できます。ここでは、アプリケーションの実行時と同様に、アプリケーションのすべての部分が設定されています。ドメインモデルの検査、値の変更、データベースへの保存が可能です。引数なしでスクリプトを起動すると、開発環境で起動します。
コンソールを起動するには、アプリケーションディレクトリから 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 自動 URL マッピングのために weblogs_controller.rb のように命名されたコントローラを保持します。すべてのコントローラは、ActionController::Base から派生する ApplicationController から派生する必要があります。
app/models post.rb のように命名されたモデルを保持します。モデルはデフォルトで ActiveRecord::Base から派生します。
app/views WeblogsController#index アクション用に weblogs/index.html.erb のように命名されたビューのテンプレートファイルを保持します。すべてのビューはデフォルトで 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 アプリケーション固有のライブラリ。基本的に、コントローラ、モデル、ヘルパーのいずれにも属さない任意のカスタムコードです。このディレクトリはロードパスに含まれます。
public Web サーバーが利用できるディレクトリです。ディスパッチャとデフォルトの HTML ファイルも含まれます。これは Web サーバーの DOCUMENT_ROOT として設定する必要があります。
script 自動化と生成のためのヘルパースクリプト。
test フィクスチャとともにユニットテストと機能テストが含まれます。rails generate コマンドを使用すると、テンプレートテストファイルが生成され、このディレクトリに配置されます。
vendor アプリケーションが依存する外部ライブラリ。plugins サブディレクトリも含まれます。アプリが frozen rails の場合、それらの gem も vendor/rails/ の下に配置されます。このディレクトリはロードパスに含まれます。