只要发送的文本包含"<",就不会从$ .ajax POST调用Action方法。

时间:2015-04-17 10:33:23

标签: jquery ajax json asp.net-mvc html-escape-characters

我正在使用以下内容在我的Intranet网站上显示一些文字:

@Html.TextAreaFor(model => model.Text)

现在,文本可能包含一些类似XML的格式,当我在表单提交上尝试以下操作时,这似乎会出现问题:

$("form").on("submit", function () {
  var model = $(this).serialize();
  $.ajax({
    url: "/Test/Foo",
    type: "POST",
    data: model,
    dataType: "json",
    success: doSomething(response)
  });
  return false;
});

操作方法采用POCO作为网站模型,使用我提交的表单并返回一些JsonResult

只要<textarea>中的文本是“普通”文本,就没有问题,我正确输入了操作方法,我的POCO具有正确的属性值。但是,一旦我将<foo>(带括号)的文字输入<textarea>,我的操作方法就不会再被点击了。

我尝试使用$(this).serializeArray(),但它也无效。 serialize()serializeArray()方法甚至取代了“&lt;”和“&gt;”标志(以及“=”;首先我认为这导致了问题),所以我猜他们在内部使用escape(),但没有发送任何内容。

当我手动发送data

{
  Text: escape($("#myTextArea").val()),
  Description: $("#someInput").val(),
  Id: $("input[type=hidden]").val()
}

它有效,也就是说,我输入了我的动作方法,但当然我有一个奇怪的格式化字符串可以在服务器上使用。

这究竟是什么问题?一些编码问题?我是否必须以其他方式序列化以避免此问题?

1 个答案:

答案 0 :(得分:5)

这是ASP.Net MVC的安全功能。默认情况下,当它在接收到的值中检测到HTML时,如果它是XSS攻击的一部分,它将阻止执行。

要在操作上停用此功能,您需要使用ValidateInput属性并将其设置为false。试试这个:

[ValidateInput(false)]
public ActionResult Foo(Model myModel) 
{
    // your logic here...
}

您还可以使用AllowHtml属性

在模型属性级别禁用此功能
public class MyModel {
    public Guid Id { get; set; }

    [AllowHtml]
    public String Description { get; set; }
}