1

私は、ユーザーが提供したURL(リンクに変換される)でXSSを防ぐための良い解決策を見つけようとしていくつかの質問を読んでいました。PHP用のものを見つけましたが、.Net用のものが見つからないようです。

明確にするために、私が欲しいのは、ユーザー提供のテキストを安全にし(ユニコードの落とし穴を含む?)、ユーザー提供のURLを安全にする(aまたはimgタグで使用される)ライブラリーだけです。

StackOverflowが非常に優れたXSS保護を備えていることに気づきましたが、残念ながら、Markdown実装の一部がMarkdownSharpから欠落しているようです。(そして私は私のコンテンツの多くにMarkdownSharpを使用しています)

4

4 に答える 4

6

Microsoftには、アンチクロスサイトスクリプティングライブラリがあります。あなたはそれを見て、それがあなたのニーズに合っているかどうかを判断することから始めることができます。また、提供するツールが本当に必要なものではないと判断した場合に従うことができるXSS攻撃を回避する方法についてのガイダンスもあります。

于 2011-04-21T04:34:56.353 に答える
2

ここで考慮すべきことがいくつかあります。まず、一般的なXSSパターンの多くをキャッチするASP.NETリクエスト検証があります。これだけに頼らないでください、しかしそれはちょっとした付加価値です。

次に、入力をホワイトリストに対して検証する必要があります。この場合、ホワイトリストは、URLの予想される構造に準拠することを目的としています。RFC2396およびRFC273に準拠するために、Uri.IsWellFormedUriStringを使用してみてください。

var sourceUri = UriTextBox.Text;
if (!Uri.IsWellFormedUriString(sourceUri, UriKind.Absolute))
{
  // Not a valid URI - bail out here
}

AntiXSSにはEncoder.UrlEncodeがあります。これは、URLに追加される文字列、つまりクエリ文字列をエンコードするのに最適です。問題は、元の文字列を取得し、スラッシュなどの文字をエスケープしたくないということですhttp://troyhunt.comそうしないhttp%3a%2f%2ftroyhunt.comと、問題が発生します。

エンコードするコンテキストはHTML属性(設定している「href」属性)であるため、Encoder.HtmlAttributeEncodeを使用します。

MyHyperlink.NavigateUrl = Encoder.HtmlAttributeEncode(sourceUri);

これが意味するのは、のような文字列http://troyhunt.com/<script>がエスケープされるということですhttp://troyhunt.com/&lt;script>-しかしもちろん、RequestValidationはとにかく最初にそれをキャッチします。

また、OWASPトップ10の未検証のリダイレクトと転送もご覧ください。

于 2011-04-22T08:15:00.673 に答える
0

文字の配列とコードを使用して別の配列を作成することで、自分でそれを行うことができると思います。配列の
文字がコードに置き換えられていることがわかった場合は、これが役立ちます。[しかし、100%ではありません]

文字配列
<
>
..。

コード配列
&lt;
&gt;
..。

于 2011-04-21T04:30:48.320 に答える
0

私はHtmlSanitizerに依存しています。これは、 XSS攻撃につながる可能性のある構造からHTMLフラグメントとドキュメントをクリーンアップするための.NETライブラリです。AngleSharpを使用して、HTMLとCSSを解析、操作、およびレンダリングします。

HtmlSanitizerは堅牢なHTMLパーサーに基づいているため、1つのフラグメント内の無効なHTMLがドキュメント全体を破損し、レイアウトやスタイルが破損する可能性がある意図的または偶発的な「タグポイズニング」からユーザーを保護することもできます。

使用法:

var sanitizer = new HtmlSanitizer();
var html = @"<script>alert('xss')</script><div onload=""alert('xss')"""
    + @"style=""background-color: test"">Test<img src=""test.gif"""
    + @"style=""background-image: url(javascript:alert('xss')); margin: 10px""></div>";
var sanitized = sanitizer.Sanitize(html, "http://www.example.com");
Assert.That(sanitized, Is.EqualTo(@"<div style=""background-color: test"">"
    + @"Test<img style=""margin: 10px"" src=""http://www.example.com/test.gif""></div>"));

オンラインデモがあり、さらに.NETフィドルで遊ぶこともできます。

(readmeからコピー/貼り付け)

于 2017-04-28T09:51:51.400 に答える