每当用户在我的web应用程序中的页面中发布包含<或>的内容时,我都会引发此异常。

我不想因为有人在文本框中输入了字符而引发异常或使整个web应用程序崩溃,但我正在寻找一种优雅的方式来处理这一问题。

捕获异常并显示

出现错误,请返回并重新键入整个表单,但这次请不要使用<

我觉得不够专业。

禁用后验证(validateRequest=“false”)肯定可以避免此错误,但这会使页面容易受到许多攻击。

理想情况下:当发生包含HTML限制字符的回发时,表单集合中的回发值将自动进行HTML编码。因此,我的文本框的.Text属性将是&lt;html&gt;

有没有办法让我从处理者那里做到这一点?


当前回答

在ASP.NET MVC中,您需要在web.config中设置requestValidationMode=“2.0”和validateRequest=“false”,并将ValidateInput属性应用于控制器操作:

<httpRuntime requestValidationMode="2.0"/>

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

and

[Post, ValidateInput(false)]
public ActionResult Edit(string message) {
    ...
}

其他回答

如果你只是想告诉你的用户不使用<和>,但是,你不希望在手写之前处理/返回整个表单(并丢失所有输入),你能简单地在字段周围放置一个验证器来筛选这些(以及其他潜在危险的)字符吗?

您可以对文本框内容进行HTML编码,但不幸的是,这并不能阻止异常的发生。根据我的经验,没有办法,您必须禁用页面验证。你这样做是在说:“我会小心的,我保证。”

如果您使用的是ASP.NET MVC,则此错误有一种不同的解决方案:

ASP.NET MVC–pages validateRequest=false不起作用?为什么ValidateInput(False)不工作?ASP.NET MVC RC1,VALIDATEINPUT,一个潜在的危险请求和陷阱

C#示例:

[HttpPost, ValidateInput(false)]
public ActionResult Edit(FormCollection collection)
{
    // ...
}

Visual Basic示例:

<AcceptVerbs(HttpVerbs.Post), ValidateInput(False)> _
Function Edit(ByVal collection As FormCollection) As ActionResult
    ...
End Function

我找到了一个使用JavaScript编码数据的解决方案,数据在.NET中解码(不需要jQuery)。

使文本框成为HTML元素(如文本区域)而不是ASP元素。添加隐藏字段。将以下JavaScript函数添加到标头中。函数boo(){targetText=document.getElementById(“HiddenField1”);sourceText=document.getElementById(“userbox”);targetText.value=转义(sourceText.innerText);}

在文本区域中,包含一个调用boo()的onchange:

<textarea id="userbox"  onchange="boo();"></textarea>

最后,在.NET中,使用

string val = Server.UrlDecode(HiddenField1.Value);

我知道这是单向的-如果你需要双向的,你必须要有创造性,但如果你不能编辑web.config,这就提供了一个解决方案

下面是我(MC9000)通过jQuery创建并使用的示例:

$(document).ready(function () {

    $("#txtHTML").change(function () {
        var currentText = $("#txtHTML").text();
        currentText = escape(currentText); // Escapes the HTML including quotations, etc
        $("#hidHTML").val(currentText); // Set the hidden field
    });

    // Intercept the postback
    $("#btnMyPostbackButton").click(function () {
        $("#txtHTML").val(""); // Clear the textarea before POSTing
                               // If you don't clear it, it will give you
                               // the error due to the HTML in the textarea.
        return true; // Post back
    });


});

以及标记:

<asp:HiddenField ID="hidHTML" runat="server" />
<textarea id="txtHTML"></textarea>
<asp:Button ID="btnMyPostbackButton" runat="server" Text="Post Form" />

这很有效。如果黑客试图绕过JavaScript发帖,他们只会看到错误。您还可以将所有这些编码的数据保存在数据库中,然后(在服务器端)对其进行解析,并在其他地方显示之前分析和检查攻击。

我也遇到了这个错误。

在我的案例中,用户在角色名称中输入了重音字符á(关于ASP.NET成员资格提供程序)。

我将角色名传递给一个方法,将用户授予该角色,而$.ajaxpost请求失败得很惨。。。

我这样做是为了解决问题:

而不是

data: { roleName: '@Model.RoleName', users: users }

这样做

data: { roleName: '@Html.Raw(@Model.RoleName)', users: users }

@Html.Raw成功了。

我得到的角色名称是HTML值roleName=“Cadastro b&#225;s”。此值与HTML实体&#225;被ASP.NET MVC阻止。现在我得到了roleName参数值,它应该是:roleName=“Cadastro Básico”,ASP.NET MVC引擎不会再阻止请求。