スキップしてメイン コンテンツへ

 none
HttpRequestValidationExceptionを引き起こすケースについて RRS feed

  • 質問

  • ASP .NETを使用したWebアプリケーションを開発、使用しています。

    サーバにWindows Server  2008+SQL Server 2008 Expressを使用していた時は、
    フォームに "&#"や "<NA>"といった文字列を使用することができていましたが、

    今回サーバを更新してWindows Server 2016+SQL Server 2014 Expressに変更したところ
    HttpRequestValidationException例外を引き起こすようになり、
    アプリケーションからDBへの登録ができない、エラー画面が出るといった不具合が発生するようになりました。


    web.configの設定は変更しておらず、

    <pages validateRequest=”false” /> の設定も入れていません。

    このような現象が発生するのは、サーバ または データベースの変更が原因なのでしょうか?
    また、スクリプトなどの危険な文字列の入力を禁止したいのですが、
    どのような文字列を入れてはいけないのか、例などはありますでしょうか?






    • 編集済み mate_gai 2019年12月13日 7:27
    2019年12月13日 7:19

すべての返信

  • 以下の記事に書いてある話ではないのでしょうか?

    ASP.NET 4 の要求の検証
    http://surferonwww.info/BlogEngine/post/2012/02/19/ASPNET-4-Request-Validation.aspx
    2019年12月13日 8:04
  • 教えていただき、ありがとうございます。

    まさにこの状況で、以前のサーバではクロスサイトスクリプティング対策がされていなかったのだと思っています。requestValidationModeの設定を変えるか、例外発生を捉えて別ページに飛ばすか、検討したいと思います。



    • 編集済み mate_gai 2019年12月15日 4:23
    2019年12月15日 4:23
  • mate_gaiさん、こんにちは。フォーラムオペレーターのHarukaです。
    MSDNフォーラムにご投稿くださいましてありがとうございます。

    >このような現象が発生するのは、サーバ または データベースの変更が原因なのでしょうか?
    →はい、これは2008バージョンでは検証されません。これは新しい機能です。

    >危険な可能性のあるRequest.Form値が検出されました。
    →このエラーは、入力されたテキスト内で HTML ステートメントのように見えるものが .NET によって検出されたためです。

    validateRequest =” false”を設定したくない場合は、TextBoxに値を割り当てるとき、HTML.Encodeメソッドを使用してみてください。
    このメソッドは、安全でない可能性のある文字をHTMLエンコードされた同等の文字に変換します。

    HTML.Encodeの詳細については、次のリンクを参照してください。
    https://docs.microsoft.com/en-us/previous-versions/iis/6.0-sdk/ms525347(v=vs.90)?redirectedfrom=MSDN

    どうぞよろしくお願いいたします。

    MSDN/ TechNet Community Support Haruka
    ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    2019年12月17日 8:11
    モデレータ
  • Haruka6002 さん>

    > →はい、これは2008バージョンでは検証されません。これは新しい機能です。

    それ、間違っていると思いますよ。何を根拠にそう言ってますか?

    念のため、自分の開発環境の Visual Studio 2008 Pro ASP.NET 3.5 で以下の単純なソースで確認しましたが、



    TextBox に <NA> と入力してポストバックすると、以下の通り質問者さんと同じエラーを再現できます。



    Microsoft の人の発言は重いですよ。何か根拠があれば、それを裏付ける Microsoft の公式文書を提示していただけますか。




    2019年12月17日 12:17
  • Haruka6002 さん>

    スルーされてしまっているようですが、あなたの回答は Microsoft の看板を背負って、Microsoft として 100% 責任を負えるものなのかだけでも教えてください。

    2019年12月18日 11:58
  • Visual Studio 2008 でなくて Windows Server 2008 の話では?

    2019年12月18日 15:06
  • > Visual Studio 2008 でなくて Windows Server 2008 の話では?

    どちらにも直接の関係はありません。

    サポートしている ASP.NET の問題で、ASP.NET 2.0 以降であれば要求の検証はデフォルトで有効です。

    Haruka6002 さんが書かれた、

    > >このような現象が発生するのは、サーバ または データベースの変更が原因なのでしょうか?
    > →はい、これは2008バージョンでは検証されません。これは新しい機能です。

    が何を意味しているのかイマイチはっきりしませんが、何にせよ Visual Studio または Windows Server のバージョンとは関係なくて、ASP.NET 2.0 以降であれば上の私のレスに書いたようにエラーとなるということです。

    私の一番最初のレスで紹介した記事にある通り、ASP.NET 3.5 以前と ASP.NET 4 以降では違いがありますが、それは機能の強化であって、要求の検証の機能自体は ASP.NET 2.0 からデフォルトで有効です。

    2019年12月19日 1:39
  • Server 2008 は .NET Framework 3.0 ですよね?

    たしか 3.5 で ASP.NET に改修が入っているので 3.5 が入っている今の OS では、動作が違っている可能性があります。

    Windows フォルダの Microsoft.NET\Framework\v2.0.50727 にある dll の更新日付を確認してみてください。

    検証するなら Windows Server 2008 でやらないとダメでしょう。

    2019年12月19日 1:49
  • > たしか 3.5 で ASP.NET に改修が入っているので 3.5 が入っている今の OS では、動作が違っている可能性があります。

    ASP.NET 2.0, 3.0, 3.5 で要求の検証に関する動作が違うと言ってます? 何を根拠に?

    自分は Windows Server 2008 は持っていませんで調べることはできませんし、ASP.NET 2.0 ~ 3.5 で違いがあるとは思ってませんので 2.0, 3.0 では検証していませんが、違いがあると思われるのであれば KOZ6.0 さんの方で検証して結果を教えていただけると幸いです。


    • 編集済み SurferOnWww 2019年12月19日 2:02 追記
    2019年12月19日 1:52
  • >ASP.NET 2.0, 3.0, 3.5 で要求の検証に関する動作が違うと言ってます? 何を根拠に?

    mate_gai さんの 2008 Server に入っている .NET と、SurferOnWww さんの検証環境に入っている .NET とでは動きが違っているかもしれないと言っています。

    事実、違っていたのでは?

    2019年12月19日 3:47
  • > mate_gai さんの 2008 Server に入っている .NET と、SurferOnWww さんの検証環境に入っている .NET とでは動きが違っているかもしれないと言っています。

    それはあなたが「違っているかもしれない」と想像しただけですよね。

    私も、「mate_gai さんの 2008 Server」上で検証できない以上、その部分は想像するしかないですが、質問の状況から私が想像したことを裏付ける Microsoft の文書はあって、それは私の一番最初のレスで紹介した記事のとおりです。

    > 事実、違っていたのでは?

    何が違っていたと言ってますか?

    質問者さんは私の最初のレスで紹介した記事を読んで、以下の通りフィードバックを返しており、結局は私が紹介した記事の内容に納得していると思いますけど。

    > まさにこの状況で、以前のサーバではクロスサイトスクリプティング対策がされていなかったのだと思っています。requestValidationModeの設定を変えるか、例外発生を捉えて別ページに飛ばすか、検討したいと思います。
    2019年12月19日 6:01
  • >> 事実、違っていたのでは?
    >何が違っていたと言ってますか?

    ここは私の誤認です。
    申し訳ありません。

    結局、設定でオフにしていたのかどうかは確認できていないですよね。

    Haruka6002 さんが「2008バージョンでは検証されません。」といったことに対して SurferOnWww さんは「まちがってますよ」と現行のOSで VS2008 のエビデンスを持ち出して否定したわけですね。

    私は、2008 は Server のことでしょうし、否定するための材料としては弱いのではないかと述べているだけです。

    2019年12月19日 8:44
  • > 私は、2008 は Server のことでしょうし、否定するための材料としては弱いのではないかと述べているだけです。

    決して弱くはないと思います。何故弱いと思うのですか? 何と比較して弱いのですか? そう言われる理由が分かりませんが。

    私のレスの内容が間違っている場合の指摘は有り難いですが、それなら間違っているという根拠を具体的に書いていただければと思います。

    2008 が Windows Server を意味していようと、Visual Studio を意味していようと、2008 年を意味していようと、その他何を意味していようと ASP.NET の「要求の検証」とは直接関係ありません。

    Haruka6002 さんは「新しい機能」と書かれてますが、ASP.NET の「要求の検証」は ASP.NET 1.1 から利用できるようになった機能ということで決して新しくはないです。 

    先のレスではオブラートに包んだ言い方にしましたが、はっきり言わせてもらえれば、

    > →はい、これは2008バージョンでは検証されません。これは新しい機能です。

    完全に間違ってます。

    ちなみに、その後の Haruka6002 さんのレス、

    > validateRequest =” false”を設定したくない場合は、TextBoxに値を割り当てるとき、HTML.Encodeメソッドを使用してみてください。

    もピント外れです。ASP.NET Web Forms アプリのことを分かって言っているとは思えません。

    なので、このスレッドの閲覧者がフォーラムオペレータのレスということで頭から信じてしまわないようにコメントしたというのが上の私のレスです。
    2019年12月19日 10:06
  • > 決して弱くはないと思います。何故弱いと思うのですか? 何と比較して弱いのですか? そう言われる理由が分かりませんが。

    (1) .NET3.5 が入っている
    (2) 2008 Server ではない

    の2点です。

    .NET3.5 が入ってない 2008 Server で検証したものに比べると弱いです。

    で、やってみました。

    結果は SurferOnWww さんのおっしゃる通りでした。

    エビデンスとして、他にとったほうが良いものはありますか?

    2019年12月19日 18:23
  • 検証結果の連絡をありがとうございました。

    > エビデンスとして、他にとったほうが良いものはありますか?

    私にとしては無いです。


    2019年12月20日 2:06