rubyにおける二等号==問題の詳細

2850 ワード

先日、コードを书いていたところ、突然プロジェクトコードにXSSの脆弱性があると警告され、すぐにレポートのURLに基づいてページコードを调べました.すぐに修复しましたが、同じ问题の讨论は2年前にありました.一般的には経験のある学生もこの点を知っているはずですが、书く必要があると思います.他の仲間にもう一度注意して、穴を踏まないようにしてください.
問題の根源.
ここで、見つかった脆弱性が現れた場所には、次のようなslimコードがあります.

input class='xxx' value==params[:account]

問題は二等号==にある.slimとERBテンプレート(他のテンプレート、例えばHAMLなど)では、二等号はRailsのrawというhelperメソッドの略であるからだ.

To insert something verbatim use the raw helper rather than calling html_safe:
 
or, equivalently, use  

つまり、上記のコードは次のようなものです.

input class='xxx' value=raw(params[:account])

Railsドキュメントでのrawメソッドの説明は次のとおりです.

This method outputs without escaping a string. Since escaping tags is now default, this can be used when you don't want Rails to automatically escape tags. This is not recommended if the data is coming from the user's input.

つまり、この方法では、入力された文字列のラベルフィルタリングやその他の処理をスキップして、文字列をHTMLに直接出力します.だから今まで原因ははっきりしていて、うっかりコードに1つの等号を追加して、2等号になったので、ユーザーの入力をレンダリングするHTMLに直接出力して、知らないうちにXSSの抜け穴を残しました.これにより、修復案は1つの等号を削除するだけでよい.

input class='xxx' value=params[:account]

これにより、Railsは入力したaccountのパラメータを自動的にフィルタリングし、悪意のあるコンテンツを自動的にフィルタリングし続けることができます.
raw、String#html_safeおよびrawメソッドのドキュメントを表示するついでに、そのソースコードを見て、極めて簡単で、1行しかありません.

# File actionview/lib/action_view/helpers/output_safety_helper.rb, line 16
def raw(stringish)
 stringish.to_s.html_safe
end

rawはstringishパラメータが文字列に変換されたことを確認してからString#html_を呼び出しただけです.safeメソッドだけです.そしてString#html_safeのドキュメントでは、この2つの方法を慎重に使用することを繰り返し強調しています.

It will be inserted into HTML with no additional escaping performed. It is your responsibilty to ensure that the string contains no malicious content. This method is equivalent to the raw helper in views.

したがって、以下の3つの書き方のコードは等価であり、安全ではないことをまとめることができます.

input class='xxx' value==params[:account]
input class='xxx' value=raw(params[:account])
input class='xxx' value=params[:account].html_safe

リッチテキストエディタなどのHTMLコンテンツを含む編集を確実に出力する必要がある場合、どのように安全を保証しますか?シナリオは簡単です.ドキュメントで推奨されているsanitize helperメソッドを使用するだけです.

It is recommended that you use sanitize instead of this method(html_safe).
(#sanitize)Sanitizes HTML input, stripping all tags and attributes that aren't whitelisted.

あるいは、フィルタ処理のために他のサードパーティのgemを使用する.
まとめ
  • は、他の人(例えばプロジェクトのRails初心者)が知らないうちに乱用しないように、二等号の略語を使用しないでください.
  • できるだけraw helperまたはString#html_を使わないsafeメソッドは、できるだけ#sanitizeを使用します.
  • ツールを使用して自動スキャンを行うことが多く、brakemanのように、XSSの脆弱性を含む多くのセキュリティ上の危険性を迅速かつ効率的に検出することができます.