fc2ブログ

2024.11 «  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 - - - - » 2025.01
TOP > CATEGORY > [2.0]View

TOP

Rails 2.0・その14(タグのサニタイズはホワイトリストで) 

2008年02月28日 ()
HTMLサニタイズは、h でできますが、タグのサニタイズは sanitize ですることができます。

その時に、どのタグのどの属性値を除去するか、というのを指定できます。

config/environment.rb ファイルに以下を書き加えると、もともと許容していたタグに新たに許容するタグを付け加えることができます。

指定したタグだけ許容するわけではないのでご注意を!

どのタグをもともと許容していたか、というのは
actionpack-2.0.2/lib/action_controller/vendor/html-scanner/html/sanitizer.rb ファイルの
self.allowed_tags という変数を探してみてください。

Rails::Initializer.run do |config|


  config.action_view.sanitized_allowed_tags = 'marquee', 'noscript' # marquee タグと noscript も許容するタグに加える


end



↑の状態でビューファイルで

<%= sanitize '<option>OP</option><strong>ST</strong><marquee>MA</marquee><noscript>NO</noscript>' %>



とすると、以下のようにブラウザに出力されます。

OP<strong>ST</strong><marquee>MA</marquee><noscript>NO</noscript>



option タグは、もともと許容されていないのでサニタイズされて消えました、ってな感じです。strong タグはもともと許容していたタグ、marquee タグと noscript タグは新たに許容したタグですね。

また、もともと許容していたタグを許容しなくすることもできます。

同じく

config/environment.rb ファイルで、

Rails::Initializer.run do |config|


  config.after_initialize do
    ActionView::Base.sanitized_allowed_tags.delete 'span' # こっちの場合、1行で複数のタグは指定できないみたいです
    ActionView::Base.sanitized_allowed_tags.delete 'div'
  end
end



↑の状態でビューファイルで

<%= sanitize '<span>SP</span><div>DI</div><strong>ST</strong>' %>



とすると、以下のようにブラウザに出力されます。

SPDI<strong>ST</strong>



span タグと div タグが削られたって訳ですね。

上記のようなタグ名の許容と同様に、属性名も許容する設定ができます。

上記の説明の、allowed_tagssanitized_allowed_tagsallowed_attributessanitized_allowed_attributes に変えるだけで応用が利きます。

こちらも是非ご利用ください。


さて、更に、sanitize メソッドを呼ぶとき限定で許容するタグ名と属性名を指定することができます。

例えば、

<%= sanitize '<option>OP</option><strong>ST</strong><marquee class="c1" id="i1" name="n1">MA</marquee>', :tags => %w(option marquee), :attributes => %w(class name) %>



とすると、以下のようにブラウザに出力されます。

<option>OP</option>ST<marquee name="n1" class="c1">MA</marquee>



strong タグは消えました。id 属性も消えました。

注意すべき点は、actionpack-2.0.2/lib/action_controller/vendor/html-scanner/html/sanitizer.rb ファイル内のもともと許容していたタグや属性(self.allowed_tags, self.allowed_attributes)とは全く関係なく設定されることです。

ということで今回は終了です。

やっぱりホワイトリスト割引は安心感が違います。

【広告】

[2008.02.28(Thu) 01:39] [2.0]ViewTrackback(0) | Comments(0) 見る▼
↑TOPへ

Rails 2.0・その8(javascriptファイルやcssファイルをひとまとめに)  

2008年02月06日 ()
流行りのAJAXやscriptaculousなどの外部のcssデザインファイルなどを使うとなると、jsファイルとcssファイルの数がやたら増えて、一つのページなのに100回もwebサーバーにアクセスしにいく、という事態が考えられます。

それを防止するのに、jsファイルやcssファイルをひとまとめにしてしまおう、というスゴイ機能ができました。

javascript_include_tag や stylesheet_link_tag の :cache を使えばよいのでした。

書き方の例

app/views/honyarara の honyarara.html.erb に、

<%= javascript_include_tag(:all, :cache => true) %>

と書きますと、

public/javascript ディレクトリに、all.js というファイルが出来ます。

このファイル、public/javascript ディレクトリの中にあったjsファイルを全て連結した1つのファイルとなっております。

<script src="/javascripts/all.js?1199936410" type="text/javascript"></script>

ページでは、この all.js だけを読み込む script タグができあがります。他の js ファイルは読み込まれません。



と、ここまでが基本編で、あとは応用編ということで・・・


perform_caching = true じゃないとこの機能が動かない
config/environments/(development|test|production).rb ファイルの
config.action_controller.perform_caching
が、true じゃあないと、この機能が動きませんのでご注意を。

デフォルトでは、production.rb だけが true になっていて、development.rb と test.rb は false になっているはずなので、

script/server -e production

で試せば、この機能を体験できます。


■all.js じゃなくて違う js ファイル名を指定できる。
:cache の値を変えれば、js ファイル名をカスタマイズすることができます。


<%= javascript_include_tag(:all, :cache => 'mycache') %>

は mycache.js というファイルができあがります。


<%= javascript_include_tag(:all, :cache => 'cache/mycache') %>

は public/javascipt/cache というディレクトリを作って、その中に mycache.js というファイルを作ります。

■べつに全部をまとめたい訳じゃないMy Mother(=わがまま)な人へ
まとめたい js ファイルだけを指定することもできます。


<%= javascript_include_tag('prototype', 'urchin', 'choochootrain', :cache => true) %>

■cache 用のファイルは自動的に消去されないし更新されない(と思う←自信なし)
上のやり方でめでたくキャッシュファイルが作成されたとして、で、prototype.js あたりが更新されたのでキャッシュファイルも更新したい、なんていう場合に、rails は自動的に更新してくれません(と思います)。

なので、手動でall.jsのようなキャッシュファイルを消して、Webサーバを再起動して、みたいなことをしなければならないです。これについてどなたかからアドバイスが欲しいなあ。

■stylesheet も同じようなやり方でファイルを1つにまとめられる

<%= stylesheet_link_tag(:all, :cache => true) %>

と書きますと、

<link href="/stylesheets/all.css" media="screen" rel="stylesheet" type="text/css" />

ができあがりますとさ。



【広告】

[2008.02.06(Wed) 20:42] [2.0]ViewTrackback(0) | Comments(0) 見る▼
↑TOPへ

Rails 2.0・その4(erb のファイル名が変わりました)  

2008年01月29日 ()
HTML や XML などをアウトプットするときに使う views ディレクトリにある erb ファイルなのですが、名前が変わりました。

[Rails 2.0.2]

test.html.erb
test.atom.builder
test.xml.erb
test.rs.rjs



[Rails 1.2.3]

test.rhtml
test.rxml
test.xml
test.rjs



みたいな感じかな(?)


【広告】

[2008.01.29(Tue) 21:14] [2.0]ViewTrackback(0) | Comments(0) 見る▼
↑TOPへ

TOP