クライアントのWebサイトでリッチテキスト編集が必要な場合はどうしますか?


18

すでにご存知のとおり、XSS攻撃は危険であり、非常に簡単に実行できます。ASP.NET MVCのように、さまざまなフレームワークによりHTMLを簡単にエンコードできます。

<%= Html.Encode("string"); %>

しかし、クライアントがMicrosoft Word文書からコンテンツを直接アップロードできることを要求するとどうなりますか?

シナリオは次のとおりです。人々はMicrosoft WordからWYSIWYGエディター(この場合はtinyMCE)にコンテンツをコピーして貼り付け、その情報をWebページに投稿できます。

Webサイトは公開されていますが、その組織のメンバーのみがWebページに情報を投稿するアクセス権を持ちます。

これらの要件を安全に処理するにはどうすればよいですか?現在、クライアントが投稿した内容のチェックは行われていません(「信頼できる」ユーザーのみが投稿できるため)が、これには特に満足しておらず、アカウントがハッキングされた場合にさらにロックダウンしたいと思います。

これらの要件を満たすことがわかっている唯一の概念的な方法は、HTMLタグホワイトリストに登録し、それらを通過させることです。別の方法はありますか?そうでない場合、ユーザーが任意の形式でデータベースに入力を保存できるようにする安全な方法は何ですか?

関連質問

クロスサイトスクリプティング(XSS)の防止


ニースはここquestion-同様のものthough-あるstackoverflow.com/questions/445177/...
RichardOD

同意した。これは似ていますが、紛らわしい質問(質問を見つけるのは難しい)であり、他の方法があるかどうかを明確に尋ねません。ホワイトリストを作成せずにHTMLをレンダリングする別の方法があれば、それだけです。これを処理するASP.NET MVC View Engineがあれば、それも知っておくと良いでしょう。
ジョージストッカー

セキュリティに関連しない注記では、タグのフィルタリングは、ユーザーインターフェイスの観点からおそらく役立つでしょう。誤って山かっこを入力して、忘れてしまうのは非常に簡単です。Wordからコピーするユーザーについて説明しているので、悪いタグのように見えるものをキャッチし、適切にエンコード(&amp; lt;)して、機能するようにすることをお勧めします。

ポイント#4に関して:それはまだ問題であるに違いない!結局、ほとんどのハックは内部の仕事です。特定のエディターについては、FreeTextBoxを使用して幸運に恵まれましたが、それがユーザーの要件、特にMVCにどの程度適合するかについて話すことはできません。
ジョエルCoehoorn 09

1
@gnatありがとう。編集しました。私の質問がなんらかのカバルの注目を集めたようです。3つの連続したダウン投票、および保護と編集のリクエスト。
ジョージストッカー

回答:


8

(開発者としての)最も簡単な方法は、おそらくMarkdownの多くのバリエーションの1つ、たとえばMarkdown.NETまたはさらに良い(imho)wmd-editorを実装することです。

その後、ユーザーは単純なHTMLを貼り付けることができますが、危険なことは何もありません。入力したデータをプレビューし、投稿する前でも問題を解決することができます。


私はStackOverflowのは、WMDの構文を必要とせずにカスタムエディタを使用すると信じて
ジョン

1
StackOverflowは実際にWMDを使用します。blog.stackoverflow.com/2008/05/... stackoverflow.com/questions/98852/...

WMD構文とはどういう意味ですか?私が知る限り、すべてのWMD構文が機能します。そして、私はまだ...仕事をしない何かを発見していない

2
Markdownの使用に関する問題は、markdownが任意のHTMLを許可することです。したがって、それ自体では解決策ではありません。
ジョージストッカー

7

ホワイトリストは、ユーザーが直接またはリッチテキストエディターを使用してHTMLを入力できるようにするときに、XSS攻撃を防ぐための最良の方法です。

他の質問について:

その場でホワイトリストに登録する機能を含むWYSIWYGエディターはありますか?

これがうまくいくとは思わない。これにはサーバー側のコードが必要で、RTEはクライアントで実行されます。

TinyMCEは必要に応じてタグをフィルタリングしますが、これはブラウザーで行われるため、信頼できません。extended_valid_elementsを参照してください。TinyMCE(Moxie)もホワイトリストを提案していますこちらをご覧ください

「プライベート投稿」専用であるため、これについても心配する必要があります

特別な理由がない限り、HTMLを常にフィルタリングする必要があります(非常にまれです)。いくつかの理由:a)今日の内部ユーザー向けの機能かもしれませんが、明日の一般向けかもしれませんb)不正アクセスの影響が少ない

それらを任意の形式でデータベースに保存するのに最適な方法ですが、適切にエンコードされ、不良タグを取り除いて表示するだけですか?

それが私が好む方法です。さまざまな理由で、データベースに挿入する前にユーザー入力を変更するのは好きではありません。


-1

私も同じことをしています。TinyMCEを使用して、Word文書からの貼り付けを許可しています。サイトを管理している特定の人だけが、管理領域を介してこれを行うことができます。これは、ASP.Netメンバーシップによって保護されています。公開サイトに送信されたときにHTML.Encodeを実行するのは簡単です。

以下のコードは、データベースに配置する前に好きな場合に使用できますが、それがどのような影響を与えるかわからない場合があります。ホワイトリストを使用する必要がある場合があります。

 /// <summary>
    /// Strip HTML
    /// </summary>
    /// <param name="str"></param>
    /// <returns></returns>
    public static string StripHTML(string str)
    {
        //Strips the HTML tags from strHTML 
        System.Text.RegularExpressions.Regex objRegExp = new System.Text.RegularExpressions.Regex("<(.|\n)+?>");

        // Replace all tags with a space, otherwise words either side 
        // of a tag might be concatenated 
        string strOutput = objRegExp.Replace(str, " ");

        // Replace all < and > with < and > 
        strOutput = strOutput.Replace("<", "<");
        strOutput = strOutput.Replace(">", ">");

        return strOutput;
    }

<script> alert( "hey")</ script>などのテキストを保存している場合、Html.Encode(<script> alert( "hey")</ script>)を実行すると、実行されずにページに印刷されます。アラート
ジョン

ホワイトリストを使用していません。そのまま保存しています。上記の機能は役立つ可能性がありますが、ノックオンがどのような影響を与えるかはわかりません。あなたが決めたことを知りたいです。投稿にマイナスのマークが付いているのはなぜですか?
ジョン

1
これは、ソフトウェアの実行方法が非常に単純な実装だからだと思います。実装を回避するあらゆる種類のトリックがあります。
ジョージストッカー

4
ホワイトリストは良いアイデアですが、あなたの方法は確かにそうではありません。HTMLはかなり難読化される可能性があるため、正規表現はテキスト内のタグを検出する信頼できる方法ではありません。HTML Agility Packなどのライブラリを使用することをお勧めします。
ノルドリン2009

-1

1つのオプションは、.NET用HTML編集コントロール(私が書いた)です。

これは.NET用のWYSIWYM HTMLエディターであり、要素を除くHTML要素のサブセットのみをサポート<script>ます。そのため、ホワイトリストとして機能します。

内部で使用する場合(イントラネットサイトなど)、コントロールをWebページに埋め込むことができます

Wordからの貼り付けのサポートを統合していませんが、その方向へのステップであるコンポーネントがあります。Docto HTMLコンバーターです。したがって、ASP.NETでドキュメントをHTMLに変換したり、エディターでHTMLを表示したりするために使用できるビルディングブロックがあります。


-2

私のIMHOは、公開されるまでユーザーを信頼し続けます。

まあ、あなたのニーズを達成するための信頼できる方法はありません。たとえば、WYSIWYGエディターは、URL(間接使用トラック、違法コンテンツ)またはテキスト(違法テキスト、スペルミス、ミステキスト)の画像を挿入するフォームの保護に失敗します。

私の観点では、ユーザーを信頼できる場合は、すべてを許可し、危険なマークアップが存在する場合はユーザーに警告するだけです(エラーを防ぐため)。

信頼できない場合は、特別なマークアップ(Markdownなど)を使用してください。

私のプロジェクトでは、潜在的に危険なコンテンツに特別なタイプを使用し、そのようなコンテンツをレンダリングして受け入れる特別な方法を使用します。このコードはスレッドモデルで高い評価を得ており、非常に注目されています(たとえば、2つの独立したコーダーが各変更をレビューする必要がある、包括的なテストスイートがあるなど)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.