2009-06-24 77 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

相关问题