6

私は単純なフォーラム アプリケーションを持っています。誰かがコンテンツを投稿すると、次のようになります。

post.Content = Sanitizer.GetSafeHtml(post.Content);

今、私が何か間違ったことをしているのか、それとも何が起こっているのかはわかりませんが、html はほとんど許可されていません。シンプルでさえ<b></b>、それには多すぎます。だから私はそのツールはまったく役に立たないと思います。

ここで私の質問: ユーザーの入力をサニタイズして、画像 (<img>タグ) を投稿したり、太字の強調などを使用したりできるようにする方法を誰か教えてもらえますか?

4

3 に答える 3

6

多くの人が消毒剤を役に立たないと感じているようです. サニタイザーを使用する代わりに、すべてをエンコードし、安全な部分をデコードして戻します。

private static readonly IEnumerable<string> WhitelistedTags =
    new[] { "<b>", "</b>", "<i>", "</i>" };

private static readonly (string Encoded, string Decoded)[] DecodingPairs =
    WhitelistedTags
    .Select(tag => (Microsoft.Security.Application.Encoder.HtmlEncode(tag), tag))
    .ToArray();

public static string Sanitize(string html)
{
    // Encode the whole thing
    var safeHtml = Microsoft.Security.Application.Encoder.HtmlEncode(html);
    var builder = new StringBuilder(safeHtml);

    // Decode the safe parts
    foreach (var (encodedTag, decodedTag) in DecodingPairs)
    {
        builder.Replace(encodedTag, decodedTag);
    }

    return builder.ToString();
}

攻撃者がこのタグを悪用するための非常に簡単な方法があるため、 IMGタグを安全にデコードすることはほとんど不可能であることに注意してください。例:

<IMG SRC="javascript:alert('XSS');">

<IMG SRC=&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#39;&#88;&#83;&#83;&#39;&#41;>

詳細なXSS チート シートについては、こちらをご覧ください。

于 2012-09-23T17:38:17.567 に答える
1

この投稿は、Anti XSS ライブラリの問題を最もよく説明しており、一連のタグと属性をホワイトリストに登録するための優れた回避策を提供しています。

私は自分のプロジェクトでこのソリューションを使用していますが、うまく機能しているようです。

于 2012-12-18T09:53:10.817 に答える