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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

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

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

2回答

8923閲覧

ASP .NETクロスサイトスクリプティング対策について

Taffy

総合スコア33

C#

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

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2020/02/27 01:55

編集2020/02/27 01:57

ASP.NETを使ったアプリケーションを開発しています。
開発環境は Visual Studio 2010 Professional
開発時のOSは Windows 10
実運用時のサーバOSはWindows Sever 2016 です。

クロスサイトスクリプティング対策時の
サニタイジングの実装タイミングについて教えてください。

現在、以下のように作っています。

WebサイトにTextBox1、Button1を配置し実行し
TextBox1に"<N>"という文字列を入力し、右のButton1をクリックします。
イメージ説明

その後、以下のエラー画面が現れました。
(「危険な可能性のある Request.Form 値がクライアント (ctl00$MainContent$TextBox1="<N>") から検出されました。」というエラーメッセージ)
イメージ説明

Button1のClickイベント、TextBox1のText_Changedイベントにサニタイジング処理を入れようとしましたが
タイミングが間違っているようで、エラーメッセージが出る現象は変わりませんでした。

C#

1TextBox1.Text = Server.HtmlEncode(TextBox1.Text);

やりたいこととしては、上記エラー画面を出さずに、
クリックイベントまたはその前に危険性のある文字列であることを検出したいと考えています。
サニタイジング処理の実装タイミングおよび、実装方法について教えていただけますでしょうか。

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

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

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

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

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

guest

回答2

0

ベストアンサー

やりたいこととしては、上記エラー画面を出さずに、クリックイベントまたはその前に危険性のある文字列であることを検出したいと考えています。

基本的に、全てのユーザー入力は検証する必要がありますが、ASP.NET Web Forms アプリにはそのために RegularExpressionValidator などの検証コントロールが用意されているので、それを使います。

検証コントロールを使えば、自動的に、クライアント側での JavaScript による検証と(CustomValidator を除く)、サーバー型での検証の両方が実装されます。クリックすると JavaScript による検証が働き、ポストバックはキャンセルされるので、質問の画像のサーバーエラーは出ません。(ユーザーに入力の修正を促すエラーメッセージは表示できます)

ただ、< ... > とかの文字列を送信したい場合もあるはずで(例えば、自分のブログなどに書き込む際に html のタグを使いたいなど)、そういう場合は @ Page ディレクティブの validateRequest 属性を false に設定して、要求の検証を無効にすることで対応できます。

詳しくは以下の記事を見てください。

ASP.NET 4 の要求の検証
http://surferonwww.info/BlogEngine/post/2012/02/19/ASPNET-4-Request-Validation.aspx

サニタイジング処理の実装タイミングおよび、実装方法について教えていただけますでしょうか。

クロスサイトスクリプティング対策としては(ユーザー入力の検証とは別の次元の話と認識してください)、最低 html にレンダリングする際に HtmlEncode してやれば十分と思います。

MVC では自動的に HtmlEncode されるようになっていますが、Web Forms ではその点要注意です。

【追記】

Button1のClickイベント、TextBox1のText_Changedイベントにサニタイジング処理を入れようとしましたがタイミングが間違っているようで、エラーメッセージが出る現象は変わりませんでした。

質問の画像のサーバーエラーはブラウザから送信されてきた文字列をサーバーが受け取った時点で発生します。なので、

TextBox1.Text = Server.HtmlEncode(TextBox1.Text);

というのは画像のサーバーエラーを回避する目的には意味が無いです。

だたし、上の回答に書きました「最低 html にレンダリングする際に HtmlEncode してやれば十分と思います」ということでは意味があります。

投稿2020/02/27 02:38

編集2020/02/27 02:53
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Taffy

2020/02/27 05:18

ご回答ありがとうございます。 >ユーザー入力の検証とは別の次元の話と認識してください クロスサイトスクリプティング対策=ユーザー入力の検証と考えておりました。 まずは、javascriptを使い、クライアント側で(サーバへデータ送信する前に) "&" , " " "などの文字列が入力されたらアラートを出すようにしたいと思います。 その後サニタイジング処理を入れるという方法を検討したいと思います。 一つ、追加で質問なのですが、サーバーエラーの対象となる文字列は(OS, .NET Frameworkなどのバージョンが上がるごとなどに)増えていったり変わっていったりするものと推測しているのですが、お分かりになりますか?
退会済みユーザー

退会済みユーザー

2020/02/27 06:30

> サーバーエラーの対象となる文字列は(OS, .NET Frameworkなどのバージョンが上がるごとなどに)増えていったり変わっていったりするものと推測しているのですが、お分かりになりますか? 分かりません。 Microsoft のドキュメントには "要求の検証では、危険性のある値のリストと照合して、すべての入力データをチェックします" と書いてありますが、そのリストは自分が調べた限りですが公開されてないようです。
Taffy

2020/02/27 06:57

ご回答ありがとうございます。 利用者から「どのような文字を入力したらがダメなのですか?」という質問が来ることを想定していました。 危険性のある値のリスト、というものは公開されていない(セキュリティに関するものだから、と思いますが)ため、どのようなものがダメというのは明確にはいえない(あくまで入力例ぐらいしか提示できない)ということを理解しました。
退会済みユーザー

退会済みユーザー

2020/02/27 09:27 編集

> 利用者から「どのような文字を入力したらがダメなのですか?」という質問が来ることを想定していました。 validateRequest が使う完全・完璧なリストは示せなくても、クロスサイトスクリプティングの基本的な仕組みからどのようなものが危険かの具体例は示すことができるはずで、それを利用者に説明してはいかがですか? これ以上は本題と外れますので、もしクロスサイトスクリプティングの具体的な話に質問があるなら新たに別のスレッドを立てて質問するようにし、このスレッドはクローズしてください。
退会済みユーザー

退会済みユーザー

2020/03/07 05:33

質問者さんが反応なしになってしまいましたが、レスに対してフィードバックなしの無言はよろしくないですよ。考え中でフィードバックするのに時間がかかりそうならその旨書いてください。 これ以上質問がなければこのスレッドはクローズしてください。
Taffy

2020/03/12 04:27

すみません。 ユーザには、基本的ですが < > & といった記号の入力をしないように説明しようと思います。
guest

0

googleで「asp.net htmlタグ 入力 エラー」で検索するといっぱい出ますよ。

投稿2020/02/27 02:35

workaholist

総合スコア559

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問