More Related Content Similar to 20080521-Ruby-on-Rails-Security Similar to 20080521-Ruby-on-Rails-Security (20) More from Koji SHIMADA (20) 20080521-Ruby-on-Rails-Security1. 2008-05-21(水); Apple Store Sapporo
Ruby Sapporo Night vol.6
Rails 入門
セキュリティ
Ruby on Rails Security
日本Rubyの会
島田浩二 Ruby札幌
snoozer.05@ruby-sapporo.org
SHIMADA Koji; Nihon Ruby-no-kai; RubySapporo
5. まとめ
✓ Railsは標準でさまざまなセキュリ
ティ対策をサポートしている
✓ 重要なのはRailsによる対策のポイン
トを理解すること
✓ 用法・用量を守って正しくお使い下
さい
6. 今日のゴール
✓ Railsアプリがセキュアかどうかを
確認するための、いくつかの基本的な
チェック項目について知る
✓ それぞれのチェック項目を満たすため
の作戦を知る
26. 重要なモデル属性を
保護できているか
db/migrate/00X_create_users.rb
create_table :users do ¦t¦
t.string :login
t.string :name
t.string :password
t.integer :admin, :default => 0
end
app/models/user.rb 制御に絡む属性
class Users < ActiveRecord::Base
end
27. 重要なモデル属性を
保護できているか
db/migrate/00X_create_users.rb
create_table :users do ¦t¦
t.string :login
t.string :name
t.string :password
t.integer :admin, :default => 0
end
app/models/user.rb 何のガードもしていない
制御に絡む属性
class Users < ActiveRecord::Base
end
28. 重要なモデル属性を
保護できているか
http://example.com/users/new
29. 重要なモデル属性を
保護できているか
http://example.com/users/new
31. 何が起きるか
オリジナルのフォーム
<form action="/users" method="post">
<input name="user[login]" type="text" />
<input name="user[name]" type="text" />
<input name="user[password]" type="text" />
<input name="commit" type="submit" value="Create" />
</form>
32. 何が起きるか
改変されたフォーム
<form action="/users" method="post">
<input name="user[login]" type="text" />
<input name="user[name]" type="text" />
<input name="user[password]" type="text" />
<input name="user[admin]" type="text" />
<input name="commit" type="submit" value="Create" />
</form>
33. 何が起きるか
改変されたフォーム
<form action="/users" method="post">
<input name="user[login]" type="text" />
フォームを改変されて使用されると
<input name="user[name]" type="text" />
<input name="user[password]" type="text" />
公開していない属性でも上書きされてしまう
<input name="user[admin]" type="text" />
<input name="commit" type="submit" value="Create" />
</form>
35. 対策
attr_protectedのサンプル
class Users < ActiveRecord::Base
attr_protected :admin
end
指定した属性は一括代入時には無視される
attr_accesibleのサンプル
class Users < ActiveRecord::Base
attr_accesible :login, :name, :password
end
指定した属性以外は一括代入時には無視される
40. コントローラメソッドが
公開されていないか
app/controllers/users_controller.rb
class UsersController < ApplicationController
# 外部に公開しているアクション
def activate
mark_as_activate if valid_request
end
# 具体的にアクティベート化を行う処理
def mark_as_activate
...
end publicメソッドとして定義してしまっている
end
48. 出力ページのエスケープ処理に
漏れはないか
app/views/users/show.erb.rhtml
...
<p>
<b>Name:<b>
<%= @user.name %>
</p>
...
hメソッドによる、特殊文字のHTMLエンティ
ティとしてのエスケープ処理が漏れている
51. 対策
✓ SafeERB
✓ http://agilewebdevelopment.com/plugins/safe_erb
✓ taint機構を使ってエスケープ漏れを
チェック
✓ エスケープ漏れがあると例外
✓ SQLiteから取り出した値はtaintedではない
ので例外が出ないので注意→確認する場合は
PostgresやMySQLで
52. 対策
✓ sanitizeメソッド
✓ ホワイトリスト方式を使用し任意のタグ
を除去
app/views/users/show.erb.rhtml
...
<p>
<b>Name:<b>
<%= sanitaize(@user.name) %>
</p>
...
68. 外部からの不正なリクエストを
ガードできているか
app/views/blog/edit.rhtml
<% form_for(@blog) do ¦f¦ %>
...
<% end %>
app/controllers/blogs_controller.rb
class BlogsController < ApplicationController
...
def update
... リクエスト処理に対して
end 何もガードをかけていない
...
end
75. 今日のゴール
✓ Railsアプリがセキュアかどうかを
確認するための、いくつかの基本的な
チェック項目について知る
✓ それぞれのチェック項目を満たすため
の作戦を知る
78. まとめ
✓ Railsは標準でさまざまなセキュリ
ティ対策をサポートしている
✓ 重要なのはRailsによる対策のポイン
トを理解すること
✓ 用法・用量を守って正しくお使い下
さい