Rails 2.0・その14(タグのサニタイズはホワイトリストで)
その時に、どのタグのどの属性値を除去するか、というのを指定できます。
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_tags や sanitized_allowed_tags を allowed_attributes や sanitized_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)とは全く関係なく設定されることです。
ということで今回は終了です。
やっぱりホワイトリスト割引は安心感が違います。
【広告】