来自客户端的 Request.Form 值可能存在潜在危险。

11

我在我的MVC.NET网站上使用CKEditor/CKFinder作为所见即所得编辑器。

我已经设置了[ValidateInput(false)],在本地调试时它可以正常工作,但是当我发布网站时,收到以下错误:

A potentially dangerous Request.Form value was detected from the client (message="<p>
<em>Testing</e...").

有人可以解释一下为什么发布的网站与本地网站不同吗,尤其是当我设置了 [ValidateInput(false)] 时?

*更新:*我正在使用 .Net 3.5,所以 [ValidateInput(false)] 不应该直接可以使用吗?


添加web.config不会禁用所有页面的验证,除非您在操作之前指定[ValidateInput(false)] - Vishal
1
你能确认一下你发布的网站所使用的.NET AppPool没有在.NET 4.0下运行吗?我猜测它是在运行的。 - Paul Hiles
谢谢,显然主机运行了 .Net 4.0。 - Dofs
6个回答

27

你尝试设置了htmlEncodeOutput属性吗?

CKEDITOR.replace('editor1', {
    htmlEncodeOutput: true });

这应该可以对输出进行编码,从而避免设置requestValidationMode。

有关此的文档在这里:ckEditor文档


7
在我看来,这比禁用验证更好。 - ashes999
1
我同意@ashes999的观点。为了帮助未来读者,这里有两个提示:1 'editor1'是ckeditor控件的id 2 不要忘记使用_System.Net.WebUtility.HtmlDecode_解码POST收到的值,否则你可能会继续遇到相同的错误。 - Mechanical Object
我没有使用CKEDITOR.replace(),而是使用<textarea class="ckeditor" ...>,我该怎么办? - Andiana
1
然后,当您需要编辑文本时,请使用<textarea id="editor1" name="editor1">@Html.Raw(System.Web.HttpUtility.HtmlDecode(Model.Text))</textarea>从数据库解码编码的文本。在此处查看更多信息:https://stackoverflow.com/questions/14978281/html-encode-decode-ckeditor - hsop

7

将以下内容添加到您的web.config文件中:

<httpRuntime requestValidationMode="2.0" />

抱歉,我忘了提到我不想在所有页面上禁用它。另外,我的问题也是关于为什么在调试时与发布后不同的原因。 - Dofs
这不会关闭所有页面。它只会使您的属性[ValidateInput(false)]起作用。http://www.hanselman.com/blog/ExperimentsInWackinessAllowingPercentsAnglebracketsAndOtherNaughtyThingsInTheASPNETIISRequestURL.aspx - stian.net
我正在使用MVC.Net 3.5,所以[ValidateInput(false)]应该开箱即用,对吗? - Dofs
据我所知,requestValidationMode不是.NET 3.5中的属性。 - Dofs
2
答案是让主机将应用程序池更改为.NET 3.5,但由于这个答案即使我在运行.NET 4.0时也有帮助,因此我将其标记为答案。 - Dofs
这个修复了报告的错误,但是移除了整个网站的请求验证,我不认为这应该成为被接受的答案。 - Robert Benyi

0
ValidateRequest="false" 添加到你的页面中:
<%@ Page Language="C#" AutoEventWireup="false" Codebehind="MyForm.aspx.cs" Inherits="Proj.MyForm" ValidateRequest="false"%>

如果使用.NET Framework 4.0(Visual Studio 2010),则可以将其添加到web.config中。

<httpRuntime requestValidationMode="2.0" />

0
只需在Post方法操作中添加一个注释,如[ValidateInput(false)]。
[HttpPost]
    [ValidateAntiForgeryToken]
    [ValidateInput(false)]
    public ActionResult Detail(ModelClass m)
    { return View(); }

0

ValidateRequest="false" 将其添加到特定页面中。

示例:


0

使用 Request.Unvalidated["myTextBox"]

例如:

var text = Request.Unvalidated["myTextBox"];

其中"myTextBox"是您想允许从中发布HTML的表单字段。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接