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

use*_*153 25 c# architecture asp.net jquery postback

我有这个问题.我尝试了一切.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>
Run Code Online (Sandbox Code Playgroud)

代码背后:

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*nna 50

使用

<httpRuntime requestValidationMode="2.0" />
Run Code Online (Sandbox Code Playgroud)

在你的web.config中(保留你已经在该元素上的任何属性,如果它已经存在).ASP.NET4.0忽略了ValidateRequest.

当然,确保你采取必要的措施来防止真正危险的请求,因为它并没有为你完成.

编辑:这样做的一个好方法是创建自己的类RequestValidator,并使用4.0行为,但使用它作为执行检查的类.

  • @AkshayKulkarni更改主.NET配置以更改默认的web.config?我想这可行,但是如果你不想改变web.config,你真的不想改变它.实际上,使用高级配置阻止在该级别未强制执行的操作并不是很有意义.你为什么不只是改变web.config? (3认同)

Jay*_*hia 29

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

<%@ Page ValidateRequest="false" %>
Run Code Online (Sandbox Code Playgroud)

每页上的此ValidateRequest ="false".如果您想要项目中的所有页面,而不是在Web.Config文件中进行更改.在此部分中添加此标记.

如果您使用.Net 4.0,则必须在Web.Config文件中再进行一次更改.在此部分中添加此标记.

<httpRuntime requestValidationMode="2.0" />
Run Code Online (Sandbox Code Playgroud)

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

<configuration>
  <system.web>
     <httpRuntime requestValidationMode="2.0" />
  </system.web>
  <pages validateRequest="false">
  </pages>
</configuration>
Run Code Online (Sandbox Code Playgroud)

这是完整的例子.点击这里...


KMX*_*KMX 5

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

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

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

<system.web>
    <pages validateRequest="false" />
</system.web>
Run Code Online (Sandbox Code Playgroud)

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

更新:甚至可以工作到.net 4.5

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

  • 使用requestValidationMode ="2.0"并仅在所需页面上关闭验证(ValidateRequest ="false")对安全性更好,而不是关闭整个站点的验证. (3认同)