今や誰もが知っているように、 XSS攻撃は危険です および 本当に簡単に引き離すことができます 。 ASP.NET MVCのように、さまざまなフレームワークによりHTMLのエンコードが容易になります。
<%= Html.Encode("string"); %>
しかし、クライアントがMicrosoft Word文書から直接コンテンツをアップロードできる必要がある場合はどうなりますか?
シナリオは次のとおりです。人々はMicrosoft WordからコンテンツをコピーしてWYSIWYGエディター(この場合は tinyMCE )に貼り付け、その情報をWebページに投稿できます。
Webサイトは公開されていますが、その組織のメンバーのみがWebページに情報を投稿するためのアクセス権を持っています。
これらの要件を安全に処理するにはどうすればよいですか?現在、クライアントが投稿した内容のチェックは行われていません(「信頼できる」ユーザーしか投稿できないため)が、特に不満があり、アカウントがハッキングされた場合に備えて、さらにロックダウンしたいと考えています。
これらの要件を満たすことがわかっている唯一の概念的な方法は HTMLタグをホワイトリストに登録し、それらを通過させる です。別の方法はありますか?そうでない場合、ユーザーがデータベースに入力を任意の形式で保存し、適切にエンコードされ、不正なタグを取り除いて表示するための安全な方法は何ですか?
(開発者としての)最も簡単な方法は、 Markdown の多くのバリエーションの1つを実装することです(例: )。 Markdown.NET または、さらに良い(imho)、 wmd-editor 。
その後、ユーザーは単純なHTMLを貼り付けることができますが、何も危険ではありません。ユーザーは入力したデータをプレビューして、投稿する前でも問題を修正できます...
ホワイトリストは、ユーザーが直接またはリッチテキストエディターを使用してHTMLを入力できるようにするときに、XSS攻撃を防ぐための最良の方法です。
他の質問について:
その場でホワイトリストに登録する機能を含むWYSIWYGエディターはありますか?
これでうまくいくとは思いません。これにはサーバー側のコードが必要で、RTEはクライアントで実行されます。
TinyMCEは必要に応じてタグをフィルタリングしますが、これはブラウザーで行われるため、信頼できません。 extended_valid_elements を参照してください。 TinyMCE(Moxie)もホワイトリストを提案しています こちら を参照してください。
これは「非公開投稿」のためだけなので、私もこれについて心配する必要があります
特定の理由がない限り(非常にまれです)、常にHTMLをフィルタリングする必要があります。いくつかの理由:a)今日の内部ユーザー向けの機能、おそらく明日の一般向けの機能b)不正アクセスによる影響は少ない
それらをデータベースに任意の形式で保存するのに最適な方法ですが、適切にエンコードされ、不良タグを取り除いて表示するだけですか?
それが私が好む方法です。さまざまな理由で、データベースに挿入する前にユーザー入力を変更したくありません。