2014-07-13 2 views
1

에 HttpException 변환 서버와 같이 오류가 발생했습니다 (구체적으로 "잠재적으로 위험한 Request.Path 값이 클라이언트에서 감지되었습니다"HttpException). 그리고 더 나쁜 것은, 전역 HandleErrorAttribute가이 특별한 "오류"를 보지 못하기 때문에 사용자는 내 사용자 정의 오류 페이지 (Views/Shared/Error.cshtml)를 얻지 못합니다. 그래서 사용자가 일반 "뭔가가 고장 났어요하지만 난 당신에게 그것을 말하지 않을 것입니다, 냐 nya 냐!" 페이지.는 HTTP 404 (페이지를 찾을 수 없음) 응답

이 응답을 변경하여 사용자가 내 사이트의 404 페이지 ("요청한 페이지를 찾을 수 없음")와 비슷하지만 HTTP 400 응답 코드와 유사한 것을 얻고 싶습니다.

내가 말할 수있는 바로는이 예외를 처리하려고하는 유일한 곳은 Global.asax Application_Error 루틴입니다. (내 사용자 지정 전역 HandleErrorAttribute는 예외가 표시되지 않습니다.)

어떤 도움이나 지침 (또는하지 말아야 할 일을 시도 할 때 날카로운 손목)은 인정 될 것입니다! 참고로

, 여기에 기존의 Global.asax 코드 :

/// <summary> Handle "page not found" (HTTP 404) errors. </summary> 
    protected void Application_EndRequest() 
    { 
     // This code is from: http://stackoverflow.com/a/9026941/1637105 
     if (Context.Response.StatusCode == 404) { 
      Response.Clear(); 

      var rd = new RouteData(); 
      rd.DataTokens["area"] = "AreaName"; // In case controller is in another area 
      rd.Values["controller"] = "Errors"; 
      rd.Values["action"] = "NotFound"; 

      IController c = new ErrorsController(); 
      c.Execute(new RequestContext(new HttpContextWrapper(Context), rd)); 
     } 
    } 

    protected void Application_Error(object sender, EventArgs e) 
    { 
     // Convert "A potentially dangerous Request.Path value was detected from the client" to an HTTP 404 (page not found) response 
     var ex = Server.GetLastError(); 
     if (ex != null && ex is HttpException) { 
      var re = new Regex(@"(?ix: \b potentially \b.+?\b dangerous \b.+?\b value \b.+?\b detected \b.+?\b client \b)"); 
      if (re.IsMatch(ex.Message)) { 
       // <Convert the response to 404> 
      } 
     } 
    } 

편집 :

내가 ELMAH 최대 행복 유선 것을 추가해야합니다, 그래서 일주일 때 이메일을 여러 번 가져 나쁜 사람은이 모든 운동 내가 ELMAH 이메일을 억제하기로 결정에 대해 온

/w00tw00t.at.blackhats.romanian.anti-sec:) 

내 사이트를 핑 (ping), 나는 것을 발견 "위험"를 포함하는 일이 더 양성 요청 문자로 인해 사용자가 내 웹 사이트처럼 보이지 않는 정말 못 생기는 웹 페이지가 표시됩니다.

elmah 이메일을 쉽게 삭제하는 것은 쉽습니다. Application_Error 루틴의 오류를 감지하여 올바른 방향으로 가고 있는지 묻는 것 같아요. 그렇다면 해당 루틴에서 수행 할 합리적으로 적절한 작업은 무엇입니까?

+0

본 적이 있습니까? http://stackoverflow.com/questions/619895/how-can-i-properly-handle-404-in-asp-net-mvc –

+0

제공된 URL과 같은 URL을 사용하면 나는'HTTP 400 '을 얻는다. 그게 당신이 얻는 것입니까? –

+0

@RowanFreeman 좋아, 그래서 방금 배웠습니다. 고마워요! 네, 기술적으로 404 (발견되지 않음)보다 정확한 400 (잘못된 요청 구문)이 표시됩니다. 하지만 악의적이지 않은 사용자는 요청한 페이지가 존재하지 않는다는 사실을 알고 싶어합니다. 그는 요청이 구문 상 올바르지 않다고 신경 쓰지 않습니다. OTOH, 나쁜 사람들은 정기적으로 가짜 요청으로 내 사이트를 핑합니다. 404가 아니라 404를 반환하면 내가 위험한 URL에 대해 경계하지 않고 내 사이트에 더 많은 관심을 기울일 것을 권장합니다. –

답변

0

좋아, 이제는 악의적 인 "위험한 값을 클라이언트에서 받았습니다"라는 결과가 HTTP 400 결과로 나타나 HTTP 404 결과를 처리하는 것과 정확히 같은 방식으로 처리 할 수 ​​있다고 생각합니다. "페이지를 찾을 수 없음"보기 표시 HTTP 상태 코드는 보존합니다.

/// <summary> Handle "page not found" (HTTP 404) and "dangerous/invalid syntax" (HTTP 400) errors. </summary> 
    protected void Application_EndRequest() 
    { 
     // This code is adapted from: https://stackoverflow.com/a/9026941/1637105 
     var code = Context.Response.StatusCode; 
     if (code == 404 || code == 400) { 
      Response.Clear(); 

      var rd = new RouteData(); 
      rd.DataTokens["area"] = "AreaName"; // In case controller is in another area 
      rd.Values["controller"] = "Errors"; 
      rd.Values["action"] = "NotFound"; 

      IController c = new ErrorsController(); 
      c.Execute(new RequestContext(new HttpContextWrapper(Context), rd)); 
     } 
    } 

그리고 (도 https://stackoverflow.com/a/9026941/1637105에서 적응) 관련 컨트롤러 코드 :

public class ErrorsController : Controller 
{ 
    /// <summary> GET: /Errors/NotFound </summary> 
    public ActionResult NotFound() 
    { 
     object model = Request.Url.PathAndQuery; 

     if (!Request.IsAjaxRequest()) { 
      return View(model); 
     } else { 
      return PartialView("_NotFound", model); 
     } 
    } 
} 

기존 오류 처리 코드에 약간의 비틀기는 내가하고 싶은 것을 단지 할 것 같다 물론 Views/Errors/NotFound.cshtml에 관련 뷰가 필요합니다.

이 질문의 문맥에서이 대답에 아무런 기여를하지 않는 Application_Error 루틴을 제거했습니다.

분명히 MVC 파이프 라인 외부에서 발생하는 오류를 포함하여 오류의 강력한 리디렉션을 원할 경우 Application_Error 핸들러를 사용해야합니다. 그러나 또 다른 질문을 던지는 주제가되었습니다.

0

나는 항상 예외를 기록하려고 노력하지만, 대부분은 중요하지 않지만 여전히 그들을 보는 것이 좋다. 기존 오류 처리 라이브러리 (http://msdn.microsoft.com/en-us/library/aa479332.aspx)를 작성하거나 더 잘 사용하십시오.

귀하의 경우에는 ELMAH를 사용하여 로그 파일/데이터베이스에 기록하고 사용자에게 오류 코드와 오류 ID를 제공하는 사용자에게 표시하고 지원 담당자에게 옵션을 제공합니다.

Hanselman은 오래 전에 ELMAH에 대해 이야기 : 그냥 추가

  1. Instll ELMAH 덩어리와
  2. 가 웹 프로젝트
  3. 을에서 필터에 추가 http://www.hanselman.com/blog/ELMAHErrorLoggingModulesAndHandlersForASPNETAndMVCToo.aspx

    당신이 뭔가를 할 것이다 웹 구성 리디렉션에 오류가 있습니다.예

    <customErrors mode="On" defaultRedirect="~/Home/Error"> 
    <error statusCode="404" redirect="~/Home/ErrorBadUrl" /> 
    </customErrors> 
    

당신이 일을 정리하는 하다며해야 할 경우를 Global.asax에 ErrorLog_Logged 이벤트에 역할을 할 수 있습니다. 추가

: 나는 ELMAH 필터를 만드는 데 사용하지만, 그것은 단지의 경우,이 켜지지 확실하지이 예제 코드입니다 :

public class ElmahErrorFilter : IExceptionFilter 
{ 
    public void OnException(ExceptionContext filterContext) 
    { 
     // Long only handled exceptions, because all other will be caught by ELMAH anyway. 
     if (filterContext.ExceptionHandled) 
      ErrorSignal.FromCurrentContext().Raise(filterContext.Exception); 
    } 
} 

편집 : 그리고 당신은 로깅 오류에 관심이없는 경우 IIS 고객 오류 페이지 (http://www.iis.net/configreference/system.webserver/httperrors)를 사용할 수 있습니다.

+0

그리고 왜 내가 혼란스러워 하는지를 추가하고 질문에 우선, 내 web.config에서''을 지정합니다. 하지만이 "오류"는 (사용자 정의 오류 페이지를 표시하는 책임이있는) 전역 HandleErrorAttribute에 의해 잡히지 않았기 때문에 분명히 추악한 "무언가가 고장 났지만 그게 무엇인지 알려주지 않을 것"이라는 메시지가 표시됩니다. –

관련 문제