トップ回答者
POST時のエンコーディング

質問
回答
-
> 「<>」 とTextBoxに入力した場合、POSTされた値を確認すると
> 「<>」 となっています。それはどこでどうやって確認しましたか?
POST するのはブラウザなので、Fiddler などのツールを使って、サ
ーバーに届く前の文字列をキャプチャして調べないと分らないはず
です。自分が調べた限りではエンコードされることはありませんで
した。また、サーバーが POST されたデータを受けて LoadPostData メ
ソッドで TextBox.Text プロパティに設定する文字列もエンコード
されていません。ただし、TextBox が HTML にレンダリングされる際には、IT246 さ
んの言われるとおり以下のようにエンコードされてました。それを
見ているのではありませんか?<input name="TextBox1" type="text" value="<>" id="TextBox1" />
> validateRequest の設定を変更しても変わりはないようです。
ASP.NET 4 ではセキュリティ強化のため、httpRuntime 要素に新し
い属性 requestValidationMode が追加されています。requestValidationMode を 2.0 に設定しないと(デフォルトは 4.0)、
たとえ @ Page ディレクティブで ValidateRequest="false" に設定
してあっても無視されます(ユーザーが <script> のような文字を
POST すると例外がスローされます)。ASP.NET 4 の要求の検証
http://surferonwww.info/BlogEngine/post/2012/02/19/ASPNET-4-Request-Validation.aspx
- 回答としてマーク 山本春海 2012年3月29日 8:39
-
> 確認は、Firebugで行っており、「<>」を入力すると「<>」となります。
それはブラウザから POST された文字ではないですよね?
先のレスでは「ブラウザから POST された文字列」とそれを受けて「サーバ
ーが返した html コード」は違うとして説明しましたが、その点は理解され
ているでしょうか?> (ユーザーIDのような)半角英数字しか許容させない項目で、先に例外が
> スローされるので、何故ですか? 例外というのは HttpRequestValidationException のことで
すよね? 半角英数字だけなら、その例外がスローされることはないはずで
すが。> (プログラム内の入力チェックで、半角英数字以外が入った場合、エラーと
> するような制御を行いたい)本当に半角英数字だけなら RegularExpressionValidator を使用しましょう。
RegularExpressionValidator クラス
http://msdn.microsoft.com/ja-jp/library/system.web.ui.webcontrols.regularexpressionvalidator%28v=vs.100%29.aspx
> 「<」が入った場合は「<」となるのに、「>」の方は「>」とならない
> のは、どうして??というのが疑問だったのです。それは自分にもわかりません。MSDN ライブラリなどにも書いてないようで
すし。
- 回答としてマーク 山本春海 2012年3月29日 8:39
すべての返信
-
> 「<>」 とTextBoxに入力した場合、POSTされた値を確認すると
> 「&lt;>」 となっています。それはどこでどうやって確認しましたか?
POST するのはブラウザなので、Fiddler などのツールを使って、サ
ーバーに届く前の文字列をキャプチャして調べないと分らないはず
です。自分が調べた限りではエンコードされることはありませんで
した。また、サーバーが POST されたデータを受けて LoadPostData メ
ソッドで TextBox.Text プロパティに設定する文字列もエンコード
されていません。ただし、TextBox が HTML にレンダリングされる際には、IT246 さ
んの言われるとおり以下のようにエンコードされてました。それを
見ているのではありませんか?<input name="TextBox1" type="text" value="<>" id="TextBox1" />
> validateRequest の設定を変更しても変わりはないようです。
ASP.NET 4 ではセキュリティ強化のため、httpRuntime 要素に新し
い属性 requestValidationMode が追加されています。requestValidationMode を 2.0 に設定しないと(デフォルトは 4.0)、
たとえ @ Page ディレクティブで ValidateRequest="false" に設定
してあっても無視されます(ユーザーが <script> のような文字を
POST すると例外がスローされます)。ASP.NET 4 の要求の検証
http://surferonwww.info/BlogEngine/post/2012/02/19/ASPNET-4-Request-Validation.aspx
- 回答としてマーク 山本春海 2012年3月29日 8:39
-
> 確認は、Firebugで行っており、「<>」を入力すると「<>」となります。
それはブラウザから POST された文字ではないですよね?
先のレスでは「ブラウザから POST された文字列」とそれを受けて「サーバ
ーが返した html コード」は違うとして説明しましたが、その点は理解され
ているでしょうか?> (ユーザーIDのような)半角英数字しか許容させない項目で、先に例外が
> スローされるので、何故ですか? 例外というのは HttpRequestValidationException のことで
すよね? 半角英数字だけなら、その例外がスローされることはないはずで
すが。> (プログラム内の入力チェックで、半角英数字以外が入った場合、エラーと
> するような制御を行いたい)本当に半角英数字だけなら RegularExpressionValidator を使用しましょう。
RegularExpressionValidator クラス
http://msdn.microsoft.com/ja-jp/library/system.web.ui.webcontrols.regularexpressionvalidator%28v=vs.100%29.aspx
> 「<」が入った場合は「<」となるのに、「>」の方は「>」とならない
> のは、どうして??というのが疑問だったのです。それは自分にもわかりません。MSDN ライブラリなどにも書いてないようで
すし。
- 回答としてマーク 山本春海 2012年3月29日 8:39
-
こんにちは、IT246 さん。
MSDN フォーラムのご利用ありがとうございます。オペレーターの山本です。
確認方法やセキュリティ強化の項目など、suferOnWww さんからの情報が参考になるのではと思います。
以下の資料は古いバージョンのものですが、XSS アタックへの対応についての基本的な考え方が記載されています。
How To: Prevent Cross-Site Scripting in ASP.NET
http://msdn.microsoft.com/en-us/library/ff649310.aspx
#IT246 さんが疑問とされている動作については、Encode Output 節のあたりが参考になるかもしれません。
#もしかしたら、サーバー側で必要最小限に判定をする実装になっているのかもしれないですね。
_____________________
日本マイクロソフト株式会社 フォーラム オペレーター 山本 春海