从客户端检测到潜在危险的 Request.Form 值

Posted

技术标签:

【中文标题】从客户端检测到潜在危险的 Request.Form 值【英文标题】:A potentially dangerous Request.Form value was detected from the client 【发布时间】:2012-02-26 03:52:36 【问题描述】:

我有这个问题。我已经尝试了一切。 ValidateRequest="false".. 以及解码和编码 html.. 等等等等..

我需要的是一个弹出框(所以我使用 ModalPopupExtender)呈现给用户,人们可以在其中输入 xml 设置并单击确定/取消按钮以关闭弹出窗口并保存。

但是我不断收到此错误“”..

下面是我的测试代码(我的场景和错误的快速示例)..

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication1.WebForm1"
    ValidateRequest="false" %>

<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="cc1" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server">
    </asp:ScriptManager>
    <div>
        <asp:Panel ID="Popup" runat="server" Width="800px" Style="display: none;">
            <asp:LinkButton ID="Display" runat="server" Style="display: none;" OnClick="Display_Click" />
            <cc1:ModalPopupExtender ID="ModalPopupExtender" runat="server" TargetControlID="Display"
                PopupControlID="Popup" DropShadow="false" Y="10" />
            <div id="Item">
                <div class="Item">
                    <table >
                        <tr>                                
                            <td>
                                <textarea id="txtAreaValue" cols="35" rows="6" style="resize: none;" runat="server" />
                            </td>
                        </tr>
                        <tr>                                
                            <td>
                                <asp:Button ID="btnOk" Text="Ok" SkinID="default" Width="50px" runat="server" />
                                <asp:Button ID="btnCancel" Text="Cancel" SkinID="default" Width="50px" OnClick="BtnCancel_Click"
                                    runat="server" />
                            </td>
                        </tr>
                    </table>
                </div>
            </div>
        </asp:Panel>
    </div>
    </form>
</body>
</html>

代码背后:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebApplication1

    public partial class WebForm1 : System.Web.UI.Page
    
        protected void Page_Load(object sender, EventArgs e)
        
            ModalPopupExtender.Show();
            string str = "<?xml version=\"1.0\" encoding=\"utf-8\"?><XmlConfig xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"> <XmlConfig Type=\"TEST\" DefiningXpath=\"/PERSON/NAME\"><Index Name=\"Name\" XPath=\"/PERSON/NAME/VALUE\" Type=\"String\" /><Index Name=\"Id\" XPath=\"/PERSON/NAME/ID\" Type=\"String\" /> </XmlConfig></XmlConfig>";

            txtAreaValue.InnerText = str;
        

        protected void Display_Click(object sender, EventArgs e)
        
            //Shows the Item detail Edit box
            ModalPopupExtender.Show();
        

        protected void BtnCancel_Click(object sender, EventArgs e)
        
            ModalPopupExtender.Hide();
        
    

运行代码.. 将 ref 添加到 AjaxControltoolkit.dll 然后运行,您将看到 textarea 填充了 xml。单击取消按钮,这会导致错误。请问谁能帮帮我?

【问题讨论】:

看看这个***.com/questions/2673850/… A potentially dangerous Request.Form value was detected from the client的可能重复 感谢 mikey :-) 它成功了.. 谢谢不敢相信它是如此简单.. 另一个问题是,这只适用于框架 4? 3.5 呢? 在 3.5 上不需要它,因为问题来自 4.0 发生的更改(我没有注意到链接到的一个 mikey,尽管我不同意 @JonEgerton 的重复声明为虽然所有信息都在那里,但它不是同一个问答,尽管 mikey 是)。 【参考方案1】:

使用

<httpRuntime requestValidationMode="2.0" />

在您的 web.config 中(保留该元素上已有的任何属性,如果它已经存在的话)。否则 ASP.NET4.0 会忽略 ValidateRequest

当然,请确保您采取必要措施来防止真正危险的请求,因为这不是为您完成的。

编辑:这样做的一个好方法是创建您自己的从RequestValidator 派生的类,并使用 4.0 行为,但将其作为进行检查的类。

【讨论】:

嗨 Jon 有什么方法可以在不更改 web.config 文件的情况下实现这一点。抱歉在错误的地方提问:) @AkshayKulkarni 更改主 .NET 配置以更改默认 web.config?我想这会起作用,但是如果您不想更改 web.config,那么您真的不想更改它。但实际上,使用高级配置来阻止在该级别未强制执行的内容并没有多大意义。为什么不直接更改 web.config? 另外我在 MSDN 上找到了一个很好的描述:Disabling Request Validation。您可以使用&lt;system.web&gt; 中的&lt;pages validateRequest="false" /&gt; 设置。【参考方案2】:

以下是可能对您有所帮助的解决方案。 为此进行服务器端配置设置。 如果您希望允许 HTML 元素作为项目中选定页面的输入,则设置此页面属性。

<%@ Page ValidateRequest="false" %>

每个页面上的这个 ValidateRequest="false"。 如果您想在项目中的所有页面中进行更改,而不是在 Web.Config 文件中进行更改。 将此标签添加到节中。

如果您使用的是 .Net 4.0,则必须在 Web.Config 文件中再做一项更改。 将此标签添加到节中。

<httpRuntime requestValidationMode="2.0" />

这里是不验证 .Net 4.0 中所有页面的请求的配置

<configuration>
  <system.web>
     <httpRuntime requestValidationMode="2.0" />
  </system.web>
  <pages validateRequest="false">
  </pages>
</configuration>

这是关于此的完整示例。 Click Here...

【讨论】:

哪个 Web.config?一个用于 Web 应用程序还是一个用于视图?【参考方案3】:

嗯,人们只在谈论 Asp.net 4.0……我想我们也需要解决其他版本。今天,当我用 TinyMCE 替换我的 AjaxToolkit 编辑器时,我遇到了同样的问题,并且使用回发我发现了同样的问题。

“从客户端检测到有潜在危险的 Request.Form 值”..

所以我在我的 webconfig 中使用了这一行,它对我有用。

<system.web>
    <pages validateRequest="false" />
</system.web>

它应该适用于 Asp.net 2.0 到 3.5。

更新:甚至可以运行到 .net 4.5

更新:您还可以尝试在页面级别而不是整个网站上验证请求。只是想让读者选择最好的方式。感谢 DVD 指出这一点。

【讨论】:

使用 requestValidationMode="2.0" 并仅在需要的页面上关闭验证 (ValidateRequest="false") 会更好的安全性,而不是关闭整个站点的验证。 @dvdnhm,伙计,问题是如何修复错误......无论是一页还是整个网络。它可以以一种或另一种方式完成。 @BradleyDotNET (slow_clap) 为什么有人会在不告诉问题的情况下将其标记为负面?【参考方案4】:

我创建了一个表 article,其中包含 articleId 和 article_content 列。我还为 article_content 列使用了 html 编辑器。当我试图保存时,我得到了同样的错误。通过在类的 article_content 属性中添加 [AllowHtml] 解决了这个问题。

 [AllowHtml]
 [Required]
 public string article_content  get; set; 

不要忘记使用 System.Web.Mvc 包含命名空间。更多详情:http://www.infinetsoft.com/Post/A-potentially-dangerous-Request-Form-value-was-detected-from-the-client/1246

【讨论】:

【参考方案5】:

如果适合您的需要,您可以在发送到服务器之前使用 javascript 对值进行编码

见this answer

【讨论】:

【参考方案6】:

“从客户端检测到有潜在危险的 Request.Form 值”..

1) 在web.config 文件中设置httpRuntime requestValidationMode="2.0" requestPathInvalidCharacters="&amp;lt;,&amp;gt;,\"

2) 在 web.config 文件的侧页标签中设置validateRequest="false"

<system.web>
    <httpRuntime requestValidationMode="2.0" requestPathInvalidCharacters="&lt;,&gt;,\"/>
 <pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID" validateRequest="false"/>
<system.web>

【讨论】:

【参考方案7】:

我在将一些电子邮件模板从 aspx 页面发送到代码后面时遇到了同样的问题......

所以我尝试通过添加来解决这个问题

 <httpRuntime requestValidationMode="2.0" />

在我的enter code here` 下的网络配置中,但这对我没有帮助,除非我放了

ValidateRequest="false"

aspx 页面的 page 指令中的属性。

【讨论】:

【参考方案8】:

有 3 个选项可以消除此错误。

    在页面指令中设置validateRequest="false"。 在 web.config 文件中设置 validateRequest="false"。 如果您使用的是 DotNet 4.0,请在 web.config 中设置 requestValidationMode="2.0"

结帐this link 了解更多信息。

【讨论】:

以上是关于从客户端检测到潜在危险的 Request.Form 值的主要内容,如果未能解决你的问题,请参考以下文章

从客户端中检测到有潜在危险的 request.form值[解决方法]

从客户端检测到潜在危险的 Request.Form 值

如何处理“从客户端检测到潜在危险的 Request.Form 值”?

从客户端中检测到有潜在危险的 Request.Form 值

从客户端中检测到有潜在危险的 request.form值[解决方法]

处理从客户端中检测到有潜在危险的 Request.Form值