私は、Ember/Rails/Postgres で書かれたディスカッション フォーラムである discourse.js のソース コードを見直してきました。この種のアプリで XSS の脆弱性を回避するためのベスト プラクティスを研究しています。
Discourse が「調理された」文字列の概念を使用していることに気付きました。これは、投稿の本文などに使用される部分的に事前にエスケープされた文字列であり、3 つの口ひげ ( {{{}}}
) を使用して Ember に表示されます。
ただし、投稿のタイトルなど、その他の場合では、談話は「タグについてのこれとあれ」などの生のエスケープされていない文字列を送受信し、二重口ひげ { {{}}
) を使用してそれらを表示します。
このすべてについて、次の質問があります。
(1) Discourse は、投稿本文など、Markdown がサポートされているフィールドにのみ「cooking」を使用しているようです。クッキングは、後処理された Markdown フィールドを処理するための単なる方法ですか、それとも XSS 問題に対処することも目的としていますか?
(2) サーバーからクライアントに JSON で渡される、HTML タグのように見えるもの、または実際には HTML タグであるものを含む生の文字列を持つことは、XSS の脆弱性とは見なされませんか? 一部の XSS スニファは、明らかにそのようなことについて不満を述べており、一部の人々は、サーバー上での HTML エンティティのエスケープおよび/またはサニタイズを推奨しているようです。