マークダウンエスケープ

ビューは自動的にそのメソッドの出力を逃れます。
ビューが適切にカバーすることはできませんし、それは私たちから特別な注意を必要とする複雑な状況があります。

花見は、弊社のWebアプリケーションのセキュリティを高めるために、エスケープヘルパーの利用可能セットになります。彼らは公共のメソッドビューとテンプレートの両方で利用可能です。

     

HTMLの内容をエスケープ

これは、呼び出されたメソッドです#escape_html(とエイリアス#hの入力をエスケープ)、。

<p><%= h "alert('xss')" %></p>

収益

<p>&lt;script&gt;alert(&apos;xss&apos;)&lt;/script&gt;</p>

     

HTML属性をエスケープ

彼らは区切り文字(例えば、単一または二重引用符)を属性伴うためHTML属性は、脱出するより複雑です。

:私たちは、この特定のタスクのための余分なヘルパー持っている#escape_html_attribute(とエイリアス#ha
属性の値は、ユーザの入力から来ている場合にのみ使用する必要があります。

<img="/path/to/avatar.png" title="<%= ha(user.name) %>'s Avatar">

     

ホワイトリストのURL

我々は、ユーザーが自分のプロフィール、ウェブサイトからリンクすることができます我々のアプリケーションに特徴を持っている想像してみてください。プロフィールを編集フォームでは、URLを受け入れるテキストフィールドを持っています。

プロフィールページでは、このようなリンクを持っています:

<%= link_to "Website", user.website_url %>

悪意のあるユーザーは、ウェブサイトのURLとJavaScriptコードを入力することによって、自分のプロフィールを編集することができます。他の誰かがそのリンクをクリックすると、彼らは、XSS攻撃を受けることができます。

例:

<a href="javascript:alert('hack!');">Website</a>

この問題を解決するには、との出力をラップすることです#escape_url(とエイリアス#hu)ヘルパー。

これは、使用するURLをホワイトリストhttphttps、およびmailtoスキームは、他のすべてが削られ。

<%= link_to "Website", hu(user.website_url) %>

ケースで我々は体系の異なるセットを必要とする、我々は2番目の引数としてそれらを指定することができます。

<%= link_to "Website", hu(user.website_url, ['https']) %>

上記のコードでは、HTTPSのみを使用するURLに制限しています。

     

生の内容

私たちは生の内容を印刷したいときにケースがあります。
エスケープされていない内容がXSS攻撃に対して違反を開くことができるので、これに注意してください。

ヘルパーが呼び出されます#raw

# apps/web/views/books/json_show.rb
require 'json'

module Web::Views::Books
class JsonShow < Show
format :json

def render
raw JSON.generate(book.to_h)
end
end
end