단일 로그인 CAS로 인해 asp.net mvc의 "클라이언트에서 잠재적인 위험이 감지된 Request.Form 값"오류

3262 단어 ASP.NETMVCWeb.NET
제가 강조하자면:asp.net mvc에서 폼을 제출할 때 '클라이언트에서 잠재적인 위험이 있는 Request.Form 값' 을 보고합니다.
방법1: 액션 머리에 [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 취약성 문제
만약 위의 두 가지 방법이 모두 안 된다면 어떻게 합니까?그럴 리가 없어.만약 정말 이런 상황이 발생한다면, 당신이 추가한handler나module를 사용했는지 확인하십시오. 예를 들어, 나는 오늘 프로젝트가 단일 로그인으로 CAS를 사용했기 때문에 클라이언트 DotNetCasClient.dll가 먼저 모든 요청을 차단합니다. 액션에 정의된 특성 같은 것은 실행할 기회가 없으면 오류가 발생합니다.
    
      
      
     

이제 홈페이지에서 제공하는 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 표시일 뿐이고 브라우저에서만 실행이 설명될 수 있기 때문이다.

좋은 웹페이지 즐겨찾기