检测到一个潜在危险的request.form值,但validateinput(false)无效

时间:2010-03-18 23:08:27

标签: asp.net-mvc-2

我已经安装了VS2010和MVC2并使用tinyMCE测试了一个简单的表单。当我在tinyMCE中发布textarea的内容时,我得到了可怕的YSD和消息

  

“有潜在危险.....”

我之前见过这个,所以我把ValidateInput(false)放在控制器上,但没有快乐 - 我仍然得到错误。

edit.aspx中的页码是:

    <% using (Html.BeginForm()){ %>

    <!-- Gets replaced with TinyMCE, remember HTML in a textarea should be encoded -->
    <textarea id="elm1" name="mceText" rows="15" cols="80" style="width: 80%">
        &lt;p&gt;
            This is some example text that you can edit inside the
  &lt;strong&gt; TinyMCE editor&lt;/strong&gt;.
    </textarea>

    <br />
    <input type="submit" name="save" value="Submit" />
    <input type="reset" name="reset" value="Reset" />
<%} %>

和控制器操作是:

    [AcceptVerbs(HttpVerbs.Post)]
    [ValidateInput(false)]
    public ActionResult Edit(string mceText)
    {

        return View();
    }

任何想法 - (我知道代码不完整)已经尝试了几个小时但是每个人都说使用ValidateInput(false)

4 个答案:

答案 0 :(得分:5)

这就是原因:http://www.asp.net/learn/whitepapers/aspnet4/breaking-changes#0.1__Toc256770147

  

ASP.NET中的请求验证功能提供了一定的级别   针对跨站点脚本(XSS)攻击的默认保护。在   在以前版本的ASP.NET中,请求验证已启用   默认。但是,它仅适用于ASP.NET页面(.aspx文件和   他们的类文件)并且只有在那些页面正在执行时才会发生。

     

在ASP.NET 4中,默认情况下,为所有人启用请求验证   请求,因为它在BeginRequest阶段之前启用   HTTP请求。因此,请求验证适用于请求   所有ASP.NET资源,而不仅仅是.aspx页面请求。这包括   请求,例如Web服务调用和自定义HTTP处理程序。请求   当自定义HTTP模块正在读取时,验证也处于活动状态   HTTP请求的内容。

     

因此,请求现在可能会发生请求验证错误   以前没有触发错误。要恢复到的行为   ASP.NET 2.0请求验证功能,添加以下设置   在Web.config文件中:

<httpRuntime requestValidationMode="2.0" />
  

但是,我们建议您分析任何请求验证错误   确定是否存在现有处理程序,模块或其他自定义代码   访问可能是XSS攻击的潜在不安全的HTTP输入   载体

答案 1 :(得分:5)

更好的解决方案可能是使用tinymce编码选项:

http://www.tinymce.com/wiki.php/Configuration:encoding

tinyMCE.init({
        ...
        encoding : "xml"
});

然后使用HttpUtility.HtmlDecode根据需要对其进行解码。

请参阅此处http://blog.tentaclesoftware.com/archive/2010/07/22/96.aspx

答案 2 :(得分:3)

找到它。

需要添加<httpRuntime requestValidationMode="2.0"/>

web.config中的

答案 3 :(得分:3)

只需:编码:“xml”单引号编码为:&amp;#39但ASP.NET验证将其视为安全漏洞,我们必须将所有&amp;#39替换为html&amp; amp:

tinyMCE.init({
 // ...
 encoding: "xml",
 setup: function (ed) {
 ed.onSaveContent.add(function (ed, o) {
 o.content = o.content.replace(/&#39/g, "&apos");
 });
 }
});

感谢Eddie。