Is it possible to remove some post data with an HttpModule?
我正在将一个古老的经典asp网站转换为asp.net。
该应用程序基本上是针对给定用户集的工具集的扩展,但它托管在外部供应商处。
要执行到该应用程序的无缝传输,它会发布一些xml数据,这些数据触发了"潜在危险的Request.Form值"。我知道我可以关闭validateRequest标志,但我不想这样做。
我已经编写了一个httpmodule,它使用此数据并使用它来验证用户身份,是否可以使用相同的模块或与此不同的模块在此之前删除过帐数据中的这些"不良"值数据是否"已验证"?
否则,如果这些想法都不起作用,我愿意接受其他建议。
是的。下列类实现了IHttpModule接口,并在发生HttpRequestValidationException检查之前触发的寄存器和事件。它检查该请求是POST,并且" testinput"不为null,然后对其进行HTML编码。该类需要在Web.config中注册为httpModule。
class ...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | 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条目...
1 2 3 4 | <system.web> <httpModules> ... |
听起来很麻烦。使用
如果您需要将输入存储在任何地方,请确保正确清理输入并对其进行编码,并且/或者确保不要在不对输入字段进行编码的情况下将其吐回到浏览器中。
我很想排除通过HTML表单将XML数据放置在字段中的糟糕模式。我了解您想"无缝"移植,这意味着您希望能够同时维护ASP和ASPX页面。但是,在这种情况下,您应该考虑同时更改表单和表单的操作目标。
我想这类似于我在这里给出的建议。仅在这种情况下,情况更糟,因为即使在经典ASP的限制内,原始ASP中的代码模式也无法达到期望的效果。
如果您不想同时完全移植ASP表单及其操作页面,则可以考虑修改ASP页面以使用XHR将XML发布到ashx,以便将XML放置在安全的地方并返回GUID。将返回的GUID放在隐藏字段中,而不是原来保存XML的字段中。在接收ASPX页面中,使用GUID检索以前发布的XML。