2009-06-24 18 views
5

Konwertuję starą klasyczną stronę asp na asp.net.Czy można usunąć niektóre dane postu za pomocą modułu HttpModule?

Aplikacja jest w zasadzie rozszerzeniem zestawu narzędzi dla danego zestawu użytkowników, ale jest hostowana u zewnętrznego dostawcy.

Aby wykonać płynne przeniesienie do tej aplikacji, POSTS trochę danych XML, które uruchamia "potencjalnie niebezpieczną wartość Request.Form". Wiem, że mógłbym wyłączyć flagę validateRequest, ale wolałbym tego nie robić.

Napisałem httpmodule, który pobiera te dane i używa ich do uwierzytelnienia użytkownika, czy możliwe jest użycie tego samego modułu lub innego modułu do usunięcia tych "złych" wartości w danych dane są "zatwierdzane"?

W przeciwnym razie, jeśli żaden z tych pomysłów nie działa, jestem otwarty na inne sugestie.

Odpowiedz

7

Tak. Poniższa klasa implementuje interfejs IHttpModule oraz rejestry i zdarzenia, które zostaną uruchomione przed sprawdzeniem wyjątku HttpRequestValidationException. Sprawdza, czy żądanie to POST i że "testinput" nie ma wartości null, a następnie HTML koduje. Klasa musi być zarejestrowana w pliku Web.config jako httpModule.

klasa ...

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"])); 
    } 
} 

wpis web.config ...

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

Ah, to sprytnie! Nie wiedziałem, że można tak napisać obiekt formularza do zapisu.Myślę, że rozwiązaniem problemu Dave'a byłoby przeanalizowanie poświadczeń bezpieczeństwa i usunięcie ich z obiektu kolekcji Form przy użyciu Form.Remove() – Alex

+0

jak miło, oznaczając to jako odpowiedź, jednak nie przetestowałem tego samodzielnie – Dave

+1

Testowałem to i działało to jak urok, ale nigdy wcześniej nie dokonywałem modyfikacji obiektów typu "tylko do odczytu", więc nie jestem pewien konsekwencji takiego działania, ale podejrzewam, że kolekcje w żądaniu są tylko do odczytu z natury oni są, a nie dlatego, że muszą być. – MyItchyChin

0

Chciałbym pokusić się o zignorowanie złego wzorca umieszczania danych XML w wiadomościach terenowych za pośrednictwem formularza HTML. Rozumiem, że chcesz, aby port "płynnie", który biorę, oznacza, że ​​chcesz mieć możliwość utrzymywania stron ASP i ASPX przez pewien czas. Jednak w takim przypadku należy rozważyć zmianę zarówno formularza, jak i celu działania formularza w tym samym czasie.

Podejrzewam, że jest to podobne do porady, którą podałem here. Tylko w tym przypadku sytuacja jest gorsza pod tym względem, że wzór kodu w oryginalnej ASP nie jest pożądany, nawet w ramach ograniczeń klasycznej ASP.

Jeśli nie chcesz całkowicie portować formularza ASP i jego strony akcji w tym samym czasie, rozważ zmodyfikowanie strony ASP, aby użyć XHR, aby opublikować kod XML w ashx, który umieszcza kod XML w bezpiecznym miejscu i zwraca identyfikator GUID . Umieść zwrócony identyfikator GUID w ukrytym polu zamiast na polu, które pierwotnie zawierało plik XML. Na odbierającej stronie ASPX użyj identyfikatora GUID, aby pobrać wcześniej opublikowany kod XML.

+0

Aplikacja, która jest zamieszczenie danych nie mam kontroli nad. Mam zamiar przenieść całą aplikację dostawcy z asp na aspx. Czekam na odpowiedź i mam nadzieję, że będę mógł zmienić działanie formularza, ale nie jestem pewien, jak bardzo elastyczny będzie ten dział. – Dave

0

Brzmi jak wiele kłopotów. Co jest złego w tym, że używanie flagi validateRequest oznacza poziom strony?

Po prostu upewnij się, że poprawnie odfiltrowujesz dane wejściowe i koduje je, jeśli chcesz je przechowywać w dowolnym miejscu i/lub upewnij się, że nie splunął z powrotem pola do przeglądarki bez kodowania go.

+0

, ponieważ klient może opublikować te poświadczenia na dowolnej stronie, musiałbym wyłączyć żądanie sprawdzania dla każdej strony – Dave

+0

Chciałbym zasugerować filtr na strumień wejściowy, ale który ma własny zestaw bóle głowy do czynienia. CptSkippy ma dobre rozwiązanie! – Alex

Powiązane problemy