1

私は、Ember/Rails/Postgres で書かれたディスカッション フォーラムである discourse.js のソース コードを見直してきました。この種のアプリで XSS の脆弱性を回避するためのベスト プラクティスを研究しています。

Discourse が「調理された」文字列の概念を使用していることに気付きました。これは、投稿の本文などに使用される部分的に事前にエスケープされた文字列であり、3 つの口ひげ ( {{{}}}) を使用して Ember に表示されます。

ただし、投稿のタイトルなど、その他の場合では、談話は「タグについてのこれとあれ」などの生のエスケープされていない文字列を送受信し、二重口ひげ { {{}}) を使用してそれらを表示します。

このすべてについて、次の質問があります。

(1) Discourse は、投稿本文など、Markdown がサポートされているフィールドにのみ「cooking」を使用しているようです。クッキングは、後処理された Markdown フィールドを処理するための単なる方法ですか、それとも XSS 問題に対処することも目的としていますか?

(2) サーバーからクライアントに JSON で渡される、HTML タグのように見えるもの、または実際には HTML タグであるものを含む生の文字列を持つことは、XSS の脆弱性とは見なされませんか? 一部の XSS スニファは、明らかにそのようなことについて不満を述べており、一部の人々は、サーバー上での HTML エンティティのエスケープおよび/またはサニタイズを推奨しているようです。

4

1 に答える 1

1

1) ここで言説が何をしているのか正確にはわからない. マークダウンは HTML にレンダリングされるため、エスケープされていない出力を使用する必要があります。そうしないと、マークダウンから生成された HTML がエスケープされます。いつ適用されるかはわかりませんが、Discourse はソース コード内で html のサニタイズを行っているようです。

2) いいえと思います。JSON は実行可能な形式ではありません。したがって、テキストがテキストなどとして扱われる限り、問題はありません。一般的な考え方として、サーバー側をエスケープしない正当な理由は、ネイティブ コントロールを使用してテキストを表示するモバイル アプリです。シングル ページ アプリとモバイル アプリは同じ JSON API を使用できますが、モバイル アプリではエスケープは必要ありません。さらに、エスケープにはコンテキストが必要です。OWASP XSS 防止チート シートでは、さまざまなエスケープが必要な一連のコンテキストが定義されています。したがって、サーバーでの単一のエスケープは間違っている可能性があります。

于 2014-04-21T07:02:43.400 に答える