2009-06-24 54 views
5

我正在將一個古老的經典asp網站轉換爲asp.net。是否可以使用HttpModule刪除一些後期數據?

的應用基本上是一組給定用戶的一個工具集的擴展,但它在外部供應商託管。

要執行無縫轉移到該應用中它的帖子被焙燒掉了「潛在危險的Request.Form值」一些XML數據。我知道我可以關閉validateRequest標誌,但我寧願不這樣做。

我已經寫了一個httpmodule,它接受這個數據並使用它來驗證用戶,是否可以使用相同的模塊或不同的模塊來解決post數據中的這些「壞」值該數據是「驗證」?

否則,如果沒有這些工作思路,我接受其他的建議。

回答

7

是的。下面的類實現IHttpModule接口和寄存器以及在發生HttpRequestValidationException檢查之前觸發的事件。它檢查請求是否爲POST,並且「testinput」不爲空,然後HTML將其編碼。該類需要作爲httpModule在Web.config中註冊。

類...

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

我會忍不住分解出把XML數據通過HTML表單字段後的窮人的模式。我知道你想要「無縫地」移植,這意味着你希望能夠同時維護ASP和ASPX頁面。但在這種情況下,您應該考慮同時更改表單的形式和操作目標。

我想這是類似的意見,我給here。只有在這種情況下,情況更糟,因爲原始ASP中的代碼模式不符合所需要的,即使在經典ASP的限制內。

如果您不想完全移植ASP表單及其操作頁面,請考慮修改ASP頁面以使用XHR將XML發佈到ashx,將XML放置在安全的位置並返回GUID 。將返回的GUID放置在隱藏字段中,而不是最初保存XML的字段。在接收的ASPX頁面中,使用GUID檢索先前發佈的XML。

+0

這是張貼我沒有控制數據的應用程序。我打算將整個供應商應用程序從asp轉換爲aspx。我正在等待迴應,希望我能夠改變表格行動,但我不確定這個部門的靈活性。 – Dave 2009-06-29 14:13:03

0

聽起來像很多麻煩。關於使用validateRequest標記頁面級別有什麼不好?

只要確保你正確地淨化輸入,如果你需要將它存儲在任何地方和/或確保你不吐回場給瀏覽器,而不對其進行編碼編碼。

+0

因爲客戶端可以將這些憑據發佈到任何頁面我需要關閉每個頁面的驗證請求 – Dave 2009-07-14 15:27:00

+0

我正要在輸入流上建議一個過濾器,但它有自己的一套麻煩來處理。 CptSkippy有一個很好的解決方案! – Alex 2009-07-20 11:55:50

相關問題