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