是否可以使用HttpModule删除一些帖子数据?

时间:2009-06-24 17:00:15

标签: asp.net asp-classic

我正在将旧的经典asp网站转换为asp.net。

该应用程序基本上是给定用户集的工具集的扩展,但它由外部供应商托管。

要执行到此应用程序的无缝传输,它会发送一些xml数据,这些数据会触发“潜在危险的Request.Form值”。我知道我可以关闭validateRequest标志,但我宁愿不这样做。

我编写了一个httpmodule,它接受这些数据并用它来验证用户,是否可以使用相同的模块或不同的模块来删除帖子数据中的这些“坏”值数据是“有效的”?

否则,如果这些想法都不起作用,我愿意接受其他建议。

3 个答案:

答案 0 :(得分:8)

是。以下类实现IHttpModule接口以及在HttpRequestValidationException检查发生之前将触发的寄存器和事件。它检查请求是否为POST,并且“testinput”不为null,然后HTML对其进行编码。 Class需要在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" />
...

答案 1 :(得分:0)

我很想知道通过HTML表单将XML数据放入字段帖子中的糟糕模式。我理解你想要“无缝地”移植它,我认为它意味着你希望能够维持ASP和ASPX页面一段时间。但是,在这种情况下,您应该考虑同时更改表单的表单和操作目标。

我想这与我给出的建议here类似。只有在这种情况下,情况更糟糕的是原始ASP中的代码模式达不到理想,即使在经典ASP的限制范围内。

如果您不想同时完全移植ASP表单及其操作页面,请考虑修改ASP页面以使用XHR将XML发布到将XML置于安全位置并返回GUID的ashx。将返回的GUID放在隐藏字段中,而不是最初保存XML的字段中。在接收ASPX页面中,使用GUID检索以前发布的XML。

答案 2 :(得分:0)

听起来很麻烦。关于在页面级别使用validateRequest标志有什么不好?

只需确保正确清理输入并对其进行编码,如果您需要将其存储在任何位置和/或确保不对其进行编码而不对其进行编码。