Asp.net 是否可以使用HttpModule删除一些post数据?

Asp.net 是否可以使用HttpModule删除一些post数据?,asp.net,asp-classic,Asp.net,Asp Classic,我正在将一个旧的经典asp网站转换为asp.net 该应用程序基本上是一组给定用户的工具集的扩展,但它由外部供应商托管 为了执行到该应用程序的无缝传输,它发布了一些xml数据,这些数据触发了“潜在危险的Request.Form值”。我知道我可以关闭validateRequest标志,但我不想这样做 我已经编写了一个httpmodule,它获取这些数据并使用它对用户进行身份验证,是否可以使用相同的模块,或者使用不同的模块,在数据“验证”之前删除post数据中的这些“坏”值 否则,如果这些想法都不管

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

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

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

我已经编写了一个httpmodule,它获取这些数据并使用它对用户进行身份验证,是否可以使用相同的模块,或者使用不同的模块,在数据“验证”之前删除post数据中的这些“坏”值


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

我会试图找出通过HTML表单将XML数据放置在字段帖子中的糟糕模式。我理解您希望“无缝”移植,我认为这意味着您希望能够在一段时间内同时维护ASP和ASPX页面。但是,在这种情况下,你应该同时考虑表单的表单和动作目标的改变。 我想这和我的建议很相似。只有在这种情况下,情况才会更糟,因为原始ASP中的代码模式没有达到理想的效果,即使在经典ASP的限制范围内也是如此


如果您不想同时完全地将ASP表单及其操作页导入,那么考虑修改ASP页面以使用XHR将XML张贴到ASSX,以将XML放置在安全的地方并返回GUID。将返回的GUID放在隐藏字段中,而不是原来包含XML的字段中。在接收ASPX页面中,使用GUID检索以前发布的XML。

听起来很麻烦。使用
validateRequest
标记页面级别有什么不好


如果需要将输入存储在任何位置,只需确保正确地对输入进行消毒并对其进行编码,和/或确保在未编码的情况下不会将字段吐回浏览器。

是。下面的类实现了IHttpModule接口,并注册了将在HttpRequestValidationException检查发生之前触发的事件。它检查请求是否为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" />
...

...

发布数据的应用程序我无法控制。不过,我确实计划将整个供应商应用程序从asp转换为aspx。我正在等待回复,希望可以更改表单操作,但我不确定该部门的灵活性。由于客户可以将这些凭据发布到任何页面,我需要关闭每个页面的验证请求,我将建议在输入流上设置一个过滤器,但它有自己的设置有很多头痛要处理。CptSkippy有一个很好的解决方案!啊,真聪明!我不知道你能让表单对象像那样可写。我想Dave问题的解决方案应该是解析安全凭据,并使用Form.remove()将其从表单集合对象中移除。多么好啊,将其标记为answer,但是我自己没有测试过,我自己测试过,效果很好,但是我从来没有对只读对象做过这样的修改,所以我不确定这样做的后果,但是我怀疑请求中的集合是只读的,这是因为它们的性质,而不是因为它们需要参数是否存在于内存中的其他任何位置?或者表单集合是它们的唯一来源?@JohnBubriski-是的,Request.Params属性返回一个NameValueCollection,它是QueryString、表单、Cookies和ServerVariables HttpValueCollections的合并。它是惰性的,因此在第一次访问属性时创建组合集合。原始HTTP POST数据也以原始格式存在,因此可以对其进行重新分析以生成原始集合。