臭名昭着的A potentially dangerous Request.Form value was detected from the client
问题:)
这是我的用例:我在网页上有一个FCKEditor控件,允许用户输入HTML。这个精确的网页已关闭验证以允许其使用,但我的母版页有链接按钮,可以提高其他页面上的回发。
我显然不希望在我的网站的每个页面上不必要地关闭验证,但我希望能够“静默”清理输入(通过从请求表单中删除错误字段,或者通过验证它)。
我看到可以在页面上覆盖OnInit或ProcessRequest,但如果可能的话,我想在母版页上执行此操作。 (我甚至不确定我能从HttpRequestValidationException
恢复
关于我如何做到这一点的任何想法?
编辑:我一直在玩Page_Error,它成功捕获了错误,但在检查完请求后我无法找到如何恢复处理。
答案 0 :(得分:5)
关闭验证,因为它会在流程中的错误阶段验证。
输入验证本质上存在缺陷;您确实需要输出验证。这意味着您可以接收任何数据,但在打印之前对其进行编码,以便显示相关的上下文。因此,对于直接写入HTML页面,您可以使用HttpUtility.HtmlEncode
和其他此类编码技术,具体取决于上下文。
答案 1 :(得分:1)
我认为您应该能够使用Richard提及的全局异常处理,但可能需要添加对ClearError的调用以摆脱 HttpRequestValidationException 和继续请求。这样的事情可能会起到作用:
protected void Application_Error(object sender, EventArgs e) {
Exception ex = Server.GetLastError().GetBaseException();
if (ex.Message.StartsWith("A potentially dangerous Request.Form value was detected")) {
Server.ClearError();
}
}
可能值得检查Request.Url和/或Request.UrlReferer以确保请求来自您的FCKEditor页面。
希望这有帮助。
答案 2 :(得分:0)
如果您想以特定方式处理异常并在此过程中检查请求,您可能需要考虑全局异常处理。这里有一篇简短的文章:
http://www.developer.com/net/asp/article.php/961301
希望这有帮助。
答案 3 :(得分:0)
您的链接按钮是否需要是按钮(帖子),还是可以将它们转换为实际链接(获取)?如果您没有传回任何数据,并且您不需要知道单击了哪个按钮,那么我建议您只使用这些链接。 get请求不会随身携带页面上的任何表单数据,因此您不会在其他页面上收到错误。如果需要,可以在链接上使用CSS样式来获取按钮外观。
答案 4 :(得分:0)
编辑:我一直在玩Page_Error,它成功地捕获了错误,但是在我检查了请求之后我找不到如何恢复处理实际上是合法的:
protected void Page_Error(object sender, EventArgs e)
{
if (Server.GetLastError() is HttpRequestValidationException)
{
Server.ClearError();
//CreateChildControls();
base.OnPreInit(e); //yeah, ugly as hell
}
}
不起作用