2009-06-24 4 views
5

나는 asp.net에 오래된 고전적인 ASP 웹 사이트를 개조하고있다.HttpModule을 사용하여 일부 게시물 데이터를 제거 할 수 있습니까?

기본적으로 응용 프로그램은 주어진 사용자 집합에 대한 도구 집합의 확장이지만 외부 공급 업체에서 호스팅됩니다.

이 응용 프로그램에 원활한 전송을 수행하기 위해 "잠재적으로 위험한 Request.Form 값"을 해고하는 일부 xml 데이터를 표시합니다. 내가 validateRequest 플래그를 끌 수 있지만 오히려 이것을하지 않을 것이라고 알고 있습니다.

이 데이터를 사용하여 사용자를 인증하는 데 사용하는 httpmodule을 작성했습니다. 동일한 모듈 또는 다른 모듈을 사용하여 이전에 게시물 데이터에서 이러한 "불량"값을 제거 할 수 있습니까? 해당 데이터는 "유효성이 검사됩니까?"

그렇지 않으면 이러한 아이디어가 없으면 다른 제안을받을 수 있습니다.

답변

7

예. 다음 클래스는 HttpRequestValidationException 검사가 발생하기 전에 발생하는 IHttpModule 인터페이스와 레지스터 및 이벤트를 구현합니다. 요청이 POST이고 "testinput"이 null이 아니고 HTML로 인코딩되었음을 확인합니다. 클래스를 Web.config에 httpModule로 등록해야합니다.

클래스 ...

using System; 
using System.Collections.Specialized; 
using System.Reflection; 
using System.Web; 

public class PrevalidationSanitizer : System.Web.IHttpModule 
{ 
    private HttpApplication httpApp; 

    public void Init(HttpApplication httpApp) 
    { 
     this.httpApp = httpApp; 
     httpApp.PreRequestHandlerExecute += new System.EventHandler(PreRequestHandlerExecute_Event); 
    } 

    public void Dispose() { } 

    public void PreRequestHandlerExecute_Event(object sender, System.EventArgs args) 
    { 
     NameValueCollection form = httpApp.Request.Form; 

     Type type = form.GetType(); 

     PropertyInfo prop = type.GetProperty("IsReadOnly", BindingFlags.Instance 
      | BindingFlags.IgnoreCase | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy); 

     prop.SetValue(form, false, null); 

     if (httpApp.Request.RequestType == "POST" != null 
      && httpApp.Request.Form["testinput"]) 
       httpApp.Request.Form.Set("testinput" 
        , httpApp.Server.HtmlEncode(httpApp.Request.Form["testinput"])); 
    } 
} 

Web.config의 항목 ...

<system.web> 
    <httpModules> 
    <add type="PrevalidationSanitizer" name="PrevalidationSanitizer" /> 
... 
+0

아, 그건 영리한 일이야! 나는 당신이 그것과 같은 쓰기 가능한 객체를 만들 수 있다는 것을 몰랐다.Dave의 문제에 대한 해결책은 보안 자격 증명을 구문 분석하고 Form.Remove()를 사용하여 Form 컬렉션 객체에서 객체를 제거하는 것입니다. – Alex

+0

답변으로 표시하는 것이 좋지만 직접 테스트하지 않았습니다. – Dave

+1

테스트 해 보았습니다. 그것은 매력처럼 작동했지만 전에는 이렇게 읽기 전용 객체를 수정하지 않았습니다. 그렇게하기 때문에 결과에 대해 확신 할 수 없지만 요청에 포함 된 콜렉션이 무엇 때문에 읽기 전용으로 만들어 졌는지는 의심 스럽습니다. 그들은 있어야하고 있기 때문에 필요하지 않기 때문입니다. – MyItchyChin

0

HTML 양식을 통해 필드 게시물에 XML 데이터를 배치하는 빈약 한 패턴을 분석하려고합니다. 나는 당신이 "완벽하게"이식하기를 원한다는 것을 이해합니다. 나는 그것이 당신이 한 번에 ASP와 ASPX 페이지를 유지할 수 있기를 원한다는 것을 의미합니다. 그러나이 경우 양식과 양식의 작업 대상을 동시에 변경하는 것을 고려해야합니다.

나는 이것이 here의 조언과 비슷하다고 생각합니다. 이 경우에만 원래 ASP의 코드 패턴이 고전 ASP의 한계 내 에서조차 바람직한 수준에 미치지 못하는 상황이 더욱 심각합니다.

ASP 폼과 해당 작업 페이지를 동시에 포트하지 않으려면 ASP 페이지를 수정하여 XHR을 사용하여 XML을 어딘가에 안전하게 배치하는 ashx에 게시하고 GUID를 반환하는 것이 좋습니다 . 반환 된 GUID는 원래 XML을 보유한 필드 대신 숨겨진 필드에 배치하십시오. 수신 ASPX 페이지에서 GUID를 사용하여 이전에 게시 된 XML을 검색합니다.

+0

내가 제어 할 수없는 데이터를 게시하는 응용 프로그램. 나는 전체 공급 업체 응용 프로그램을 aspx에서 aspx로 전환 할 계획을 가지고 있습니다. 나는 그것에 대한 응답을 기다리고 있으며, 나는 행동 양식을 바꿀 수 있기를 바라고 있지만 부서가 얼마나 유연한 지 정확히 알지 못합니다. – Dave

0

많은 번거 로움 소리가납니다. 페이지 수준으로 validateRequest 플래그를 사용하는 것에 대해 매우 나쁜 점은 무엇입니까?

입력을 올바르게 위생 처리하고 어디에서나 저장해야하거나 인코딩하지 않고 브라우저에 입력하지 않도록해야합니다.

+0

클라이언트가 이러한 자격 증명을 모든 페이지에 게시 할 수 있기 때문에 각 페이지에 대한 요청의 유효성을 확인하지 않아야합니다. – Dave

+0

입력 스트림에 필터를 제안하려고했으나 처리해야 할 두통이 있습니다. CptSkippy에는 좋은 해결책이 있습니다! – Alex

관련 문제