客户端提交了可能危险的Request.Form值。

25

我有这个问题,我已经尝试了各种方法,比如将 ValidateRequest="false",解码和编码html等。

我需要一个弹出框(所以我使用了ModalPopupExtender),向用户呈现一个窗口,让他们可以输入XML设置,然后点击“确定/取消”按钮来关闭弹出窗口并保存。

但是,我一直收到这个错误信息:“从客户端检测到一个潜在的危险 Request.Form 值”。

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

<%@ 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 width="100%">
                        <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();
        }
    }
}

运行代码时,请添加对AjaxControlToolkit.dll的引用,然后运行,您将看到文本区域中填充了xml。 单击“取消”按钮会导致错误。 请问有人能帮我吗?


2
请查看此链接:https://dev59.com/lHE85IYBdhLWcg3wqVT4 - mikey
谢谢Mikey :-) 它起作用了。谢谢,我简直不敢相信它是那么简单的。 - user929153
另一个问题是,这只适用于框架4吗?那3.5呢? - user929153
听着,user92。你应该注意Jon的警告,并确保你理解了你刚刚禁用了什么,并采取措施防止成功攻击。在我的情况下,我需要让管理员输入HTML和脚本,因此我将ValidateRequest=false设置限制在只有管理员可以访问的页面上。即使如此,一个能够获取管理员帐户的攻击者也可能对最终看到管理员输入代码的用户造成真正的伤害。 - mikey
1
可能是重复的问题:客户端检测到一个潜在危险的 Request.Form 值 - Burgi
显示剩余3条评论
8个回答

50

使用

<httpRuntime requestValidationMode="2.0" />

在你的web.config中添加以下内容(如果该元素已存在,则保留任何属性)。否则,ASP.NET4.0会忽略ValidateRequest

当然,在不自动检查危险请求的情况下,请确保采取必要的措施来防范真正危险的请求。

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


嗨Jon,有没有不改变web.config文件的方法来实现这个问题。很抱歉在错误的地方提问了 :) - MaxRecursion
3
您好,我会尽力进行翻译。以下是需要翻译的内容:@AkshayKulkarni 更改主要的.NET配置文件以更改默认的web.config?我想这样做应该可以,但如果您不想更改web.config,那么您真的不想更改这个。但实际上,使用高级别的配置来阻止某些在该级别上没有被强制执行的东西是没有太多意义的。为什么您不只更改web.config呢? - Jon Hanna
1
此外,我在 MSDN 上找到了一个很好的描述:禁用请求验证。您可以在 <system.web> 中使用 <pages validateRequest="false" /> 设置。 - Matt

29

这里有可能会帮到您的解决方案。为此进行服务器端配置设置。如果您想允许来自项目中选定页面的HTML元素作为输入,则可以设置此页面属性。

<%@ Page ValidateRequest="false" %>

每个页面都需要在

中添加ValidateRequest="false"。 如果您想在项目的所有页面中使用,则需要在Web.Config文件中进行更改。 在<system.web>部分中添加此标记。

如果您正在使用.Net 4.0,则需要在Web.Config文件中进行另一个更改。 在<system.web>部分中添加此标记。

<httpRuntime requestValidationMode="2.0" />

以下是在 .Net 4.0 中不验证所有页面请求的配置。
<configuration>
  <system.web>
     <httpRuntime requestValidationMode="2.0" />
  </system.web>
  <pages validateRequest="false">
  </pages>
</configuration>

哪个Web.config?是Web应用程序的还是Views的? - NicVerAZ

5

人们仅谈论 Asp.net 4.0……我猜我们也需要考虑其他版本。今天,当我将 AjaxToolkit 编辑器替换为 TinyMCE 时,遇到了相同的问题,而且在 Postback 时发现了同样的问题。

"A potentially dangerous Request.Form value was detected from the client"..

因此,我在我的 webconfig 中使用了这行代码,并且它对我有用。

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

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

更新:即使在.NET 4.5中也可以正常工作。

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


3
使用requestValidationMode="2.0",并且仅在需要的页面上关闭验证(ValidateRequest="false")将更有利于安全,而不是关闭整个站点的验证。 - dvdmn
@dvdnhm,兄弟,问题是如何修复错误......无论是单个页面还是整个网站。总能找到一种方法解决它。 - KMX
@BradleyDotNET(慢慢地鼓掌) - KMX
1
为什么有人会在不告诉问题的情况下将其标记为负面? - KMX

1
我创建了一张名为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


1
你可以使用JavaScript在发送到服务器之前对值进行编码,如果这符合您的需求。
请参见此答案

0

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

所以我尝试通过添加

 <httpRuntime requestValidationMode="2.0" />

在我的Web配置文件中,有enter code here,但除非我放置了它,否则这并没有帮助我。

ValidateRequest="false"

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


0

客户端检测到一个潜在危险的 Request.Form 值。

1)在 web.config 文件中设置 httpRuntime requestValidationMode="2.0" requestPathInvalidCharacters="&lt;,&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>

0

有三种方法可以解决此错误。

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

查看此链接以获取更多信息。


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