質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
.NET Core

.NET Coreは、マネージソフトウェアフレームワークでオープンソースで実装されています。クロスプラットフォームを前提に考えられており、Windows/Mac/Linuxで動くアプリケーションを作成することが可能です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

ASP.NET MVC Framework

ASP.NET MVC Frameworkは、MVCパターンをベースとした、マイクロソフトのウェブアプリケーション開発用のフレームワークです。

Q&A

解決済

2回答

2332閲覧

ASP.NET Core MVCでのjson post時のXSS対策について困っています。

退会済みユーザー

退会済みユーザー

総合スコア0

.NET Core

.NET Coreは、マネージソフトウェアフレームワークでオープンソースで実装されています。クロスプラットフォームを前提に考えられており、Windows/Mac/Linuxで動くアプリケーションを作成することが可能です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

ASP.NET MVC Framework

ASP.NET MVC Frameworkは、MVCパターンをベースとした、マイクロソフトのウェブアプリケーション開発用のフレームワークです。

0グッド

0クリップ

投稿2020/11/20 00:47

編集2020/11/20 04:08

実現したいこと

C#、ASP.NET Core MVC(.NET 5 または .NET Core 3.1) でのjson post時のXSS対策について困っています。

例えば、javascript gridに直接入力したデータについて、200~300レコード程度のデータをjavascriptからjsonでpostします。
(サーバー側では、DBにデータ追加か、データ変更があるものに更新をかけます)

以前、ASP.NET MVC 5 を利用していた時、json post時は下記の記事のように、
Controller側で[ValidationJsonXss]属性を追加して利用していました。

XSS validation from MVC action from JSON ajax post
https://stackoverrun.com/ja/q/12580451

C#

1using System; 2using System.IO; 3using System.Web; 4using System.Web.Mvc; 5using System.Web.Util; 6 7namespace WebApplication.Common { 8 9 public class ValidateJsonXssAttribute : ActionFilterAttribute { 10 public override void OnActionExecuting(ActionExecutingContext filterContext) { 11 var request = filterContext.HttpContext.Request; 12 13 if (request != null && "application/json; charset=UTF-8".Equals(request.ContentType, StringComparison.OrdinalIgnoreCase)) { 14 if (request.ContentLength > 0 && request.Form.Count == 0) { 15 16 // InputStream has already been read once from "ProcessRequest" 17 if (request.InputStream.Position > 0) { 18 request.InputStream.Position = 0; 19 } 20 21 using (var reader = new StreamReader(request.InputStream)) { 22 // Get posted JSON content 23 var postedContent = reader.ReadToEnd(); 24 25 // Invoke XSS validation 26 int failureIndex; 27 var isValid = RequestValidator.Current.InvokeIsValidRequestString( 28 HttpContext.Current, postedContent, RequestValidationSource.Form, "postedJson", out failureIndex 29 ); 30 31 // Not valid, so throw request validation exception 32 if (!isValid) { 33 throw new HttpRequestValidationException("Potentially unsafe input detected"); 34 } 35 } 36 } 37 } 38 } 39 } 40}

本題ですが、

  1. 上記の方法をASP.Net Core MVC用に置き換えるか、新しいソースへ変更したいと思っていますが、

英語記事など探してもなかなか最善の方法が見つからなく困っています。

  1. その他、何か最善の方法があれば、ご教授ください。

よろしくお願いします。

参考にした記事

・ASP.NET Core でクロスサイトスクリプティング (XSS) を防止する
https://docs.microsoft.com/ja-jp/aspnet/core/security/cross-site-scripting?view=aspnetcore-5.0

・HttpUtility.HtmlEncode メソッド
https://docs.microsoft.com/ja-jp/dotnet/api/system.web.httputility.htmlencode?view=net-5.0

・XSS validation from MVC action from JSON ajax post
https://stackoverrun.com/ja/q/12580451

・XSS Prevention .NET Core 2.x and above
https://stackoverflow.com/questions/59770235/xss-prevention-net-core-2-x-and-above

補足情報(FW/ツールのバージョンなど)

.NET 5 または .NET Core 3.1
C#、ASP.NET Core MVC
Visual Studio 2019 Professional

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/11/20 02:46

参考にしている記事は URL の文字列を記載するだけでなくリンクを張ってください。
退会済みユーザー

退会済みユーザー

2020/11/20 04:08

こんにちは リンクをほうを貼らせて頂きました。
退会済みユーザー

退会済みユーザー

2020/11/21 02:38

質問者さん、また無言になってしまいましたが、回答したのでそれに対するフィードバックを書いてください。役に立った/立たなかったぐらいはすぐ返せるのでは? 役に立たなかったなら期待する回答とどう違うかを書いてもらえると別の案が出せるかも。 とにかく無言は NG です。前のスレッドでも書きましたが、返事がない = 会話ができない = フォローしても時間と労力の無駄になりそうな人・・・と言うことでブラックリスト入りです。
guest

回答2

0

返信欄の間違い訂正。

投稿2020/11/21 12:09

編集2020/11/21 12:11
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

アクションフィルターに使われている InvokeIsValidRequestString メソッドと同等の機能のものが Core 3.1 にあれば解決できると思いますが、自分が探した限り残念ながらなさそうです。

テキストボックスに <script> とかを入力して送信すると、.NET Framework 版の Web Forms や MVC では、デフォルトで有効になっている validateRequest 属性によって、以下の画像のようにエラーになったのですか、その機能さえも Core ではなくなっています。(同じことをしても Core ではエラーになりません)

イメージ説明

以下の記事の回答によると "ASP.NET Core does not have a feature similar to Request validation, as Microsoft decided, that it’s not a good idea." という Microsoft の判断だそうです。

Enable asp.net core request validation
https://stackoverflow.com/questions/39061401/enable-asp-net-core-request-validation

なので、InvokeIsValidRequestString メソッドと同等の機能を自力でコードを書いて実装するほかなさそうです。

それより、とりあえず JSON 文字列はそのまま受けて、

サーバー側では、DBにデータ追加か、データ変更があるものに更新をかけます

の際に検証して対処するか、表示する際に Html エンコードする(@Html.Raw(..) 以外の html ヘルパを使えば自動的にエンコードされる)ようにする方が現実的ではないかと思います。

投稿2020/11/20 04:51

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/11/21 12:10

ご回答ありがとうございます。 いままでの方法が使えないのであれば、おっしゃられた通り、データ追加、更新時に検証するようにしたいと思います。 NugetでHtmlSanitizer等のパッケージもあるようですので。 また、返信について事情により、当日または翌日中に返信できないこともありますので、ご了承下さい。 アドバイスありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問