none
ValidateInputについて RRS feed

  • 質問

  • 開発環境 = VS2015 Pro
    DB       = SQL Server2008
    言語     = C#

    いつもお世話になっております。
    現在、MVC5を勉強中です。

    そこで、ValidateInputについてご教示頂きたいのですが、
    メソッド単位やプロパティ単位では[ValidateInput(false)]と記載すれば、
    入力検証を無効に出来る記載は見つかるのですが、
    コントローラ全体やアプリケーション全体で無効化するには
    どのように設定すればよいか判らず、投稿させて頂きます。

    可能であるならば、適用する際の注意点もご教示頂けると助かります。

    以上、何卒宜しくお願い申し上げます。

    2016年9月21日 2:13

回答

  • > コントローラ全体やアプリケーション全体で無効化するには
    > どのように設定すればよいか判らず、投稿させて頂きます。

    普通はそんな必要はまずないはずですが、どうしてもということなら・・・

    App_Start フォルダに FilterConfig.cs というファイルがありませんか? (MVC4 にはあります。MVC5 は不明)

    あったらそこに ValidateInputAttribute(false) を追加して試してみてください。以下のような感じです。

    using System.Web;
    using System.Web.Mvc;
    
    namespace Mvc4App3
    {
        public class FilterConfig
        {
            public static void RegisterGlobalFilters(GlobalFilterCollection filters)
            {
                filters.Add(new HandleErrorAttribute());            
                
                // 追加
                filters.Add(new ValidateInputAttribute(false));
            }
        }
    }

    > 適用する際の注意点もご教示頂けると助かります。

    アプリ全体に適用するのはセキュリティ上の問題があります。普通は許可するのは一部の特定のアクションメソッドだけで済むはずです。

    試験のため一時的に設定するだけにしても、くれぐれも元に戻すのを忘れないようにしましょう。


    #ちなみに、web.config ファイルの <pages> 要素内にて ValidateRequest="false" に設定するのは MVC では効果がないようです。

    • 回答としてマーク kong0214 2016年9月21日 7:28
    2016年9月21日 6:41
  • こんにちは。

    http://www.atmarkit.co.jp/ait/articles/0908/14/news041_5.html

    このあたりを見ると

    原則として、ValidateInput属性をFalseに設定するのは、(アプリケーションやコントローラ全体に対してではなく)必要最小限のアクションに留めるのが好ましい。

    とありますね。

    個人的には、すべて許可してしまうと、その分だけテスト工数が増えそうなので、必要なメソッドだけ許可でいいのかな、と思います。

    • 回答としてマーク kong0214 2016年9月21日 8:09
    2016年9月21日 7:38
  • > 理由は、
    > HTML文字列の入力を許さないのはアプリ側の都合であり、ユーザーは入力したいかもしれない為、
    > ユーザーが望まない限り禁止すべきでないとの事。

    何か勘違いがありませんか?

    ネットには善意のユーザーだけでなく、悪意を持ってあなたのサイトを攻撃しようとする者も少なからずいるかもしれないと思って、可能な限りのセキュリティ対策は取った方がいいと思いますよ。

    仮に、悪意はなかったとしても、知識のないユーザーに勝手に html タグとかスクリプトを入力さたら困るということはあるはずです。

    基本的にユーザー入力は信用できないと思っておいたほうがよさそうです。


    > 秀和システムから出ている【ASP.NET MVC5】には
    > 『著者はグローバルフィルターを使用して、入力検証を無効化しても良いと考える』とあります。

    その本はこれ ↓ ですよね?

    http://www.shuwasystem.co.jp/products/7980html/4179.html

    その著者と同じ人が @IT の記事、

    第4回 フィルタ属性による認証/キャッシュ/セキュリティ対策の実装 (5/5)
    http://www.atmarkit.co.jp/ait/articles/0908/14/news041_5.html

    で、

    "ただし、データ検証を無効にした場合、(当然のことながら)クライアントが「有害な」データを送信しても、ASP.NETはこれを検出することができない。原則として、ValidateInput属性をFalseに設定するのは、(アプリケーションやコントローラ全体に対してではなく)必要最小限のアクションに留めるのが好ましい。また、データ検証を無効にしたアクションについては、必ず自分で入力値の検証を行うべきである"

    と書いているのですが・・・ 自分は上記の通りだと思うのですが、著者さんは考えが変わったのでしょうか?

    > また、Razorのコードナゲットを利用すれば、意図せずタグ文字列が出力されてしまう危険は無いとの事。

    それは以下の記事の話(デフォルトで全ての文字列が HTML エンコードされる)ですよね?

    ASP.NET MVC 3 Razor における HTML エンコードと Html.Raw メソッドの利用
    https://blogs.msdn.microsoft.com/chack/2011/01/02/asp-net-mvc-3-razor-html-html-raw/

    確かに HTML エンコードで生の html タグや script タグが直接レンダリングされることはなくなりますから、クロスサイトスクリプティングなどの脅威は軽減されると思います。

    でも、それと上に書いた理由、

    > HTML文字列の入力を許さないのはアプリ側の都合であり、ユーザーは入力したいかもしれない為、

    は矛盾しているのでは? ユーザーが html タグを入力したいのは文字の大きさや色を変えたりリンクを貼ったりしたいからですよね? HTML エンコードしたらそれはできなくなってしまうのですが・・・


    • 編集済み SurferOnWww 2016年9月21日 11:37 誤記訂正
    • 回答としてマーク kong0214 2016年9月26日 2:57
    2016年9月21日 9:06

すべての返信

  • > コントローラ全体やアプリケーション全体で無効化するには
    > どのように設定すればよいか判らず、投稿させて頂きます。

    普通はそんな必要はまずないはずですが、どうしてもということなら・・・

    App_Start フォルダに FilterConfig.cs というファイルがありませんか? (MVC4 にはあります。MVC5 は不明)

    あったらそこに ValidateInputAttribute(false) を追加して試してみてください。以下のような感じです。

    using System.Web;
    using System.Web.Mvc;
    
    namespace Mvc4App3
    {
        public class FilterConfig
        {
            public static void RegisterGlobalFilters(GlobalFilterCollection filters)
            {
                filters.Add(new HandleErrorAttribute());            
                
                // 追加
                filters.Add(new ValidateInputAttribute(false));
            }
        }
    }

    > 適用する際の注意点もご教示頂けると助かります。

    アプリ全体に適用するのはセキュリティ上の問題があります。普通は許可するのは一部の特定のアクションメソッドだけで済むはずです。

    試験のため一時的に設定するだけにしても、くれぐれも元に戻すのを忘れないようにしましょう。


    #ちなみに、web.config ファイルの <pages> 要素内にて ValidateRequest="false" に設定するのは MVC では効果がないようです。

    • 回答としてマーク kong0214 2016年9月21日 7:28
    2016年9月21日 6:41
  • いつもお世話になっております。

    回答頂きまして有難うございます。

    秀和システムから出ている【ASP.NET MVC5】には
    『著者はグローバルフィルターを使用して、入力検証を無効化しても良いと考える』とあります。

    理由は、
    HTML文字列の入力を許さないのはアプリ側の都合であり、ユーザーは入力したいかもしれない為、
    ユーザーが望まない限り禁止すべきでないとの事。
    また、Razorのコードナゲットを利用すれば、意図せずタグ文字列が出力されてしまう危険は無いとの事。

    確かにネットで検索すると
    入力検証は有効化したままで、個別のプロパティに設定されるケースが多々見受けられましたが、
    ただいま勉強中でして、どちらが標準的なのか判らず質問させて頂きました。


    以上です。

    2016年9月21日 7:27
  • こんにちは。

    http://www.atmarkit.co.jp/ait/articles/0908/14/news041_5.html

    このあたりを見ると

    原則として、ValidateInput属性をFalseに設定するのは、(アプリケーションやコントローラ全体に対してではなく)必要最小限のアクションに留めるのが好ましい。

    とありますね。

    個人的には、すべて許可してしまうと、その分だけテスト工数が増えそうなので、必要なメソッドだけ許可でいいのかな、と思います。

    • 回答としてマーク kong0214 2016年9月21日 8:09
    2016年9月21日 7:38
  • いつもお世話になっております。

    私が勉強中の「ASP.NET MVC5」と同じ著者です。
    リンク先は私も拝見致しました。

    そこで、2009年当時は個別に、上記を執筆した際の2014年には考え方が変わったのかな?
    と思いましたので、質問させて頂きました。

    今までアドバイスを頂きましたとおり、
    入力検証の無効化は個別に設定するのが標準と考えます。


    以上です。

    2016年9月21日 8:09
  • > 理由は、
    > HTML文字列の入力を許さないのはアプリ側の都合であり、ユーザーは入力したいかもしれない為、
    > ユーザーが望まない限り禁止すべきでないとの事。

    何か勘違いがありませんか?

    ネットには善意のユーザーだけでなく、悪意を持ってあなたのサイトを攻撃しようとする者も少なからずいるかもしれないと思って、可能な限りのセキュリティ対策は取った方がいいと思いますよ。

    仮に、悪意はなかったとしても、知識のないユーザーに勝手に html タグとかスクリプトを入力さたら困るということはあるはずです。

    基本的にユーザー入力は信用できないと思っておいたほうがよさそうです。


    > 秀和システムから出ている【ASP.NET MVC5】には
    > 『著者はグローバルフィルターを使用して、入力検証を無効化しても良いと考える』とあります。

    その本はこれ ↓ ですよね?

    http://www.shuwasystem.co.jp/products/7980html/4179.html

    その著者と同じ人が @IT の記事、

    第4回 フィルタ属性による認証/キャッシュ/セキュリティ対策の実装 (5/5)
    http://www.atmarkit.co.jp/ait/articles/0908/14/news041_5.html

    で、

    "ただし、データ検証を無効にした場合、(当然のことながら)クライアントが「有害な」データを送信しても、ASP.NETはこれを検出することができない。原則として、ValidateInput属性をFalseに設定するのは、(アプリケーションやコントローラ全体に対してではなく)必要最小限のアクションに留めるのが好ましい。また、データ検証を無効にしたアクションについては、必ず自分で入力値の検証を行うべきである"

    と書いているのですが・・・ 自分は上記の通りだと思うのですが、著者さんは考えが変わったのでしょうか?

    > また、Razorのコードナゲットを利用すれば、意図せずタグ文字列が出力されてしまう危険は無いとの事。

    それは以下の記事の話(デフォルトで全ての文字列が HTML エンコードされる)ですよね?

    ASP.NET MVC 3 Razor における HTML エンコードと Html.Raw メソッドの利用
    https://blogs.msdn.microsoft.com/chack/2011/01/02/asp-net-mvc-3-razor-html-html-raw/

    確かに HTML エンコードで生の html タグや script タグが直接レンダリングされることはなくなりますから、クロスサイトスクリプティングなどの脅威は軽減されると思います。

    でも、それと上に書いた理由、

    > HTML文字列の入力を許さないのはアプリ側の都合であり、ユーザーは入力したいかもしれない為、

    は矛盾しているのでは? ユーザーが html タグを入力したいのは文字の大きさや色を変えたりリンクを貼ったりしたいからですよね? HTML エンコードしたらそれはできなくなってしまうのですが・・・


    • 編集済み SurferOnWww 2016年9月21日 11:37 誤記訂正
    • 回答としてマーク kong0214 2016年9月26日 2:57
    2016年9月21日 9:06