2017.03 «  - - - - - - 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 - - - - - - » 2017.05
TOP > Rails 2.0・その14(タグのサニタイズはホワイトリストで)

 ← Rails 2.0・その15(コントローラでの例外処理をまとめて記述) | TOP | Rails 2.0・その13(http only cookie をサポート)

スポンサーサイト 

--年--月--日 (--)
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


【広告】

[--.--.--(--) --:--] スポンサー広告 | Trackback(-) | Comment(-)
↑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・その15(コントローラでの例外処理をまとめて記述) | TOP | Rails 2.0・その13(http only cookie をサポート)

COMMENT

COMMENT POST















管理者にだけ表示

 ← Rails 2.0・その15(コントローラでの例外処理をまとめて記述) | TOP | Rails 2.0・その13(http only cookie をサポート)
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。