web-dev-qa-db-ja.com

ASP.NET CoreでXSSから保護する方法は?

ASP.NETにはRequest Validationがありましたが、ASP.NET Coreにはそのようなものはありません。

ASP.NET CoreアプリをXSSから最善の方法で保護するにはどうすればよいですか?

リクエストの検証が完了しましたhttps://nvisium.com/resources/blog/2017/08/08/dude-wheres-my- request-validation.html -この男はModelsでRegExを推奨しています:

_[RegularExpression(@"^[a-zA-Z0-9 -']*$", ErrorMessage = "Invalid characters detected")]
public string Name { get; set; }
_

...しかし、それはグローバリゼーション/国際化では機能しません。つまり、æ、øå汉字などの非ラテン文字です。

X-XSSを実行する>制限された<XSS保護https://dotnetcoretutorials.com/2017/01/10/set- x-xss-protection-asp-net-core / このようになりますが、限定的なサポートのみがあります:

_public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    app.Use(async (context, next) =>
    {
        context.Response.Headers.Add("X-Xss-Protection", "1");
        await next();
    });

    app.UseMvc();
}
_

Microsoftのドキュメントは2年前のものです https://docs.Microsoft.com/en-us/aspnet/core/security/cross-site-scripting?view=aspnetcore-2.1 と本当にそれをカバーします。

私は次のような簡単なことをすることを考えています:

_myField = myField.Replace('<','').Replace('>','').Replace('&','').Repl...;
_
  • すべてのデータ送信について-しかし、それは一種の不安定なようです。

Microsoftにも同じ質問をしましたが、実際のアプリケーションで人々がこの問題をどのように解決しているかを知りたいです。

更新:私たちが達成しようとしていること:

このアプリケーションでは、名前、電子メール、コンテンツなどを入力できるWebフォームを用意しています。データはデータベースに保存されており、フロントエンドシステムや将来的には他のシステム(RSSフィード、JSONなど)で表示されるようになります。一部のフォームにはリッチテキストエディター(tinymce)が含まれており、ユーザーはテキストをマークアップできます。悪意のあるユーザーがフィールドに<script>alert('evil stuff');</script>を入力する可能性があります。データベースに到達する前にASP.NET Coreで悪意のある文字を削除する最良の方法は何ですか。悪意のあるスクリプトをデータベースに保存しないことをお勧めします。

私はこのようなものがうまくいくと考えました:

_const string RegExInvalidCharacters = @"[^&<>\""'/]*$";

[RegularExpression(RegExInvalidCharacters, ErrorMessage = "InvalidCharacters")]
public string Name { get; set; }

[RegularExpression(RegExInvalidCharacters, ErrorMessage = "InvalidCharacters")]
public string Content { get; set; }

...
_
9
Sha

stored/reflected XSSを防ぐ最善の方法の1つは、出力をHTML-Encodeにすることです。 DBに保存する前にエンコードすることもできます。いずれにしても、これらのフィールドからの出力がHTMLである必要はありません。

正規表現を使用したソリューションが常に機能するとは限りません。ここで行っているのは、ブラックリストに依存しているということです。 Whitelist(この場合は不要)に依存する方が常により適切で安全です。または、可能であれば、出力をHTMLエンコードします。

3
shawkyz1

具体的には、ここで何をしようとしていますか? xss攻撃を無菌化しない場合に、レンダリングされる可能性のあるコンテンツを含む可能性のある投稿を防止しますか?もしそうなら、私が最近同僚と話し合ったように、あなたのサイトによっては、あなたは一種のことはできません。

つまり、投稿されたデータに対してクライアント側の制限を提供できますが、これは明らかにバイパスされる可能性があるので、あなたのアクションは何をしようとしていますか? 無害化された場合が潜在的なxssリスクであるコンテンツが投稿されないようにしますか?

あなたは何ですかpostエンドポイントは責任がありますか?他のシステムが受け取った出力をどのようにレンダリングするかについて責任がありますか?

私の主なxssリスクは、アプリがデータをレンダリングする方法にあると主張します。データを使用しているアプリに基づいて出力をサニタイズ/エンコードしていない場合は、おそらく間違っています。

Webページなどに何かを出力している場合、潜在的なxssの問題は実際の問題にすぎないことに注意してください。これは、実際にはデータの問題を受け取るエンドポイントではありません。

2
dougajmcdonald

ASP.NET Coreで HtmlSanitizer ライブラリを使用できます。

1

私はこれが1年前のものであることを知っていますが、あなた(および他の人)の参考のために、着信要求をサニタイズするResourceFilterまたはミドルウェアの作成を検討することをお勧めします。そこで必要なツールやカスタムコードを使用できますが、重要なのは、すべての受信リクエストがこのフィルターを通過して、不正なデータをサニタイズすることです。

アプリケーション/ニーズに合った正しいフィルターを使用してください。 ResourceFilterはモデルバインディングの前に実行され、ActionFilterはモデルバインディングの後に実行されます。

1
Zach J.