我正在将旧的经典asp网站转换为asp.net。
该应用程序基本上是给定用户集的工具集的扩展,但它由外部供应商托管。
要执行到此应用程序的无缝传输,它会发送一些xml数据,这些数据会触发“潜在危险的Request.Form值”。我知道我可以关闭validateRequest标志,但我宁愿不这样做。
我编写了一个httpmodule,它接受这些数据并用它来验证用户,是否可以使用相同的模块或不同的模块来删除帖子数据中的这些“坏”值数据是“有效的”?
否则,如果这些想法都不起作用,我愿意接受其他建议。
答案 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
标志有什么不好?
只需确保正确清理输入并对其进行编码,如果您需要将其存储在任何位置和/或确保不对其进行编码而不对其进行编码。