単点登録CASによるasp.Netmvcの「クライアントから危険性のあるRequest.Form値を検出」エラー


私は強調します:asp.Netmvcでフォームのコミットに遭遇した場合、「クライアントから危険性のあるRequest.Form値が検出されました」というエラーを報告します.
方法1:action頭部に[ValidateInput(false)]の特性を加えるだけで十分であり、絶対に実行可能である.ネット上でプロファイルを修正するなんて信じないで、実行時を2.0に変更して、もうすぐ5.0になります.あなたはまだ2.0になっています.
しかし、同じフォームに複数のフィールドがあるため、これは最善の方法ではありません.良い方法は、
方法2:コミットするときは、FormCollectionパラメータの代わりにエンティティクラスパラメータを使用し、エンティティクラスにhtmlタグの属性を使用し、[AllowHtml]の特性を加える必要があります.
    public class MailVM
    {
        public string Title { get; set; }
        public string Time { get; set; }
        [AllowHtml]
        public string Mess { get; set; }
    }

参考記事:ASP.NET MVCページでリッチテキストコントロールを使用したXSS脆弱性の問題
上の2つの方法がだめなら、どうしますか?これは不可能です.もし本当にこのような状況が発生したら、あなたがいくつかの追加のHandlerやmoduleを使ったかどうかを確認します.例えば、私は今日発見しました.プロジェクトはCASを単一のログインとして使用しているので、クライアントDotNetCasClient.dllは率先してすべてのリクエストをブロックし、action上の特性を定義するなど、まだ実行する機会がなく、エラーを報告します.
    
      
      
     

このとき、公式サイトからもらったDotNetCasClientを少し修正します.大丈夫です.公式サイトのアクティブコードは、直接ダウンロードして修正します.元のコードは
        internal static bool GetRequestIsCasSingleSignOut()
        {
            CasAuthentication.Initialize();

            HttpContext context = HttpContext.Current;
            HttpRequest request = context.Request;

            bool requestIsFormPost = (request.RequestType == "POST");
            //      
            bool haveLogoutRequest = !string.IsNullOrEmpty(request.Params["logoutRequest"]);

            bool result =
            (
                requestIsFormPost &&
                haveLogoutRequest
            );

            return result;
        }

CASクライアントは、危険なコンテンツを意図的にブロックしていませんが、request.Params["logoutRequest"]という読み取り動作は自然に異常をトリガーします.原因が分かれば直しやすい.
変更可能
        internal static bool GetRequestIsCasSingleSignOut()
        {
            CasAuthentication.Initialize();

            HttpContext context = HttpContext.Current;
            HttpRequest request = context.Request;

            bool requestIsFormPost = (request.RequestType == "POST");

            //by chenqu
            bool haveLogoutRequest = false;
            if(requestIsFormPost)
            {
                try
                {
                    haveLogoutRequest = !string.IsNullOrEmpty(request.Params["logoutRequest"]);
                }
                catch(System.Web.HttpRequestValidationException ex)
                {
                    haveLogoutRequest = false;
                }
                catch(Exception ex)
                {
                    throw ex;
                }
            }

            bool result =
            (
                requestIsFormPost &&
                haveLogoutRequest
            );

            return result;
        }

変更後、新しいDotNetCasClientにコンパイルします.dll、置換項目でOKです.ニマはもうあなたが危険な内容を提出したことを心配する必要はありません.実は、XSSというドメイン間攻撃は、提出されたコンテンツがサーバーに届くと、まだ問題はありません.あなたが提出したコンテンツをページに表示してこそ攻撃が発生します.HTMLタグにすぎないので、ブラウザでしか説明されません.