none
POST時のエンコーディング RRS feed

  • 質問

  • Framework 4.0

    TextBoxに入力した文字がPOSTされる際、文字によって、エンコーディングされる場合と、されない場合があるようです。

     < : &lt;にエンコーディングされPOSTされる。

     > : そのまま>としてPOSTされる。

    この他にも、;(セミコロン)などがエンコーディングされない事を確認しています。

    validateRequest の設定を変更しても変わりはないようです。

    タグ埋め込みを防止するため、Framework側で自動処理されるのでしょうか??

    2012年3月13日 5:57

回答

  • > 「<>」 とTextBoxに入力した場合、POSTされた値を確認すると
    > 「&lt;>」 となっています。

    それはどこでどうやって確認しましたか?

    POST するのはブラウザなので、Fiddler などのツールを使って、サ
    ーバーに届く前の文字列をキャプチャして調べないと分らないはず
    です。自分が調べた限りではエンコードされることはありませんで
    した。

    また、サーバーが POST されたデータを受けて LoadPostData メ
    ソッドで TextBox.Text プロパティに設定する文字列もエンコード
    されていません。

    ただし、TextBox が HTML にレンダリングされる際には、IT246 さ
    んの言われるとおり以下のようにエンコードされてました。それを
    見ているのではありませんか?

    <input name="TextBox1" type="text" value="&lt;>" 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
    2012年3月13日 12:53
  • > 確認は、Firebugで行っており、「<>」を入力すると「&lt;>」となります。

    それはブラウザから POST された文字ではないですよね?

    先のレスでは「ブラウザから POST された文字列」とそれを受けて「サーバ
    ーが返した html コード」は違うとして説明しましたが、その点は理解され
    ているでしょうか?

    > (ユーザーIDのような)半角英数字しか許容させない項目で、先に例外が
    > スローされるので、

    何故ですか? 例外というのは HttpRequestValidationException のことで
    すよね? 半角英数字だけなら、その例外がスローされることはないはずで
    すが。

    > (プログラム内の入力チェックで、半角英数字以外が入った場合、エラーと
    >  するような制御を行いたい)

    本当に半角英数字だけなら RegularExpressionValidator を使用しましょう。

    RegularExpressionValidator クラス
    http://msdn.microsoft.com/ja-jp/library/system.web.ui.webcontrols.regularexpressionvalidator%28v=vs.100%29.aspx


    > 「<」が入った場合は「&lt;」となるのに、「>」の方は「&gt;」とならない
    > のは、どうして??というのが疑問だったのです。

    それは自分にもわかりません。MSDN ライブラリなどにも書いてないようで
    すし。

    • 回答としてマーク 山本春海 2012年3月29日 8:39
    2012年3月14日 12:21
  • suferOnWwwさん、山本さん、ありがとうございました。

    サーバー側での実装という事のようですね。

    • 回答としてマーク IT246 2012年3月27日 8:00
    2012年3月27日 8:00

すべての返信

  • 確認ですが、TextBoxのTextプロパティに指定された値が表示される時ではなく、POST時でしょうか? POST時であればそのデータを処理するのはあくまでサーバー側のプログラムですので、HTMLエンコードを行う必要はないように思うのですが・・・


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2012年3月13日 6:15
    モデレータ
  • >確認ですが、TextBoxのTextプロパティに指定された値が表示される時ではなく、POST時でしょうか?

    はい、POST時です。

    >POST時であればそのデータを処理するのはあくまでサーバー側のプログラムですので、HTMLエンコードを行う必要はないように思うのですが・・・

    trapemiyaさんがおっしゃるように、画面表示の処理ではないので、HTMLエンコーディングは必要ないと思います。

    「<>」 とTextBoxに入力した場合、POSTされた値を確認すると 「&lt;>」 となっています。

    2012年3月13日 6:29
  • > 「<>」 とTextBoxに入力した場合、POSTされた値を確認すると
    > 「&lt;>」 となっています。

    それはどこでどうやって確認しましたか?

    POST するのはブラウザなので、Fiddler などのツールを使って、サ
    ーバーに届く前の文字列をキャプチャして調べないと分らないはず
    です。自分が調べた限りではエンコードされることはありませんで
    した。

    また、サーバーが POST されたデータを受けて LoadPostData メ
    ソッドで TextBox.Text プロパティに設定する文字列もエンコード
    されていません。

    ただし、TextBox が HTML にレンダリングされる際には、IT246 さ
    んの言われるとおり以下のようにエンコードされてました。それを
    見ているのではありませんか?

    <input name="TextBox1" type="text" value="&lt;>" 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
    2012年3月13日 12:53
  • >それはどこでどうやって確認しましたか?
    確認は、Firebugで行っており、「<>」を入力すると「&lt;>」となります。

    validateRequestに関しましては、(ユーザーIDのような)半角英数字しか
    許容させない項目で、先に例外がスローされるので、falseにしたいと考え
    ています。
    (プログラム内の入力チェックで、半角英数字以外が入った場合、エラーと
     するような制御を行いたい)

    「<」が入った場合は「&lt;」となるのに、「>」の方は「&gt;」とならない
    のは、どうして??というのが疑問だったのです。

    2012年3月13日 23:58
  • > 確認は、Firebugで行っており、「<>」を入力すると「&lt;>」となります。

    それはブラウザから POST された文字ではないですよね?

    先のレスでは「ブラウザから POST された文字列」とそれを受けて「サーバ
    ーが返した html コード」は違うとして説明しましたが、その点は理解され
    ているでしょうか?

    > (ユーザーIDのような)半角英数字しか許容させない項目で、先に例外が
    > スローされるので、

    何故ですか? 例外というのは HttpRequestValidationException のことで
    すよね? 半角英数字だけなら、その例外がスローされることはないはずで
    すが。

    > (プログラム内の入力チェックで、半角英数字以外が入った場合、エラーと
    >  するような制御を行いたい)

    本当に半角英数字だけなら RegularExpressionValidator を使用しましょう。

    RegularExpressionValidator クラス
    http://msdn.microsoft.com/ja-jp/library/system.web.ui.webcontrols.regularexpressionvalidator%28v=vs.100%29.aspx


    > 「<」が入った場合は「&lt;」となるのに、「>」の方は「&gt;」とならない
    > のは、どうして??というのが疑問だったのです。

    それは自分にもわかりません。MSDN ライブラリなどにも書いてないようで
    すし。

    • 回答としてマーク 山本春海 2012年3月29日 8:39
    2012年3月14日 12:21
  • こんにちは、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 節のあたりが参考になるかもしれません。
    #もしかしたら、サーバー側で必要最小限に判定をする実装になっているのかもしれないですね。
    _____________________
    日本マイクロソフト株式会社 フォーラム オペレーター 山本 春海

    2012年3月16日 9:02
  • suferOnWwwさん、山本さん、ありがとうございました。

    サーバー側での実装という事のようですね。

    • 回答としてマーク IT246 2012年3月27日 8:00
    2012年3月27日 8:00