【问题标题】:asp.net mvc ajax errorasp.net mvc ajax错误
【发布时间】:2013-03-03 11:52:34
【问题描述】:

在测试通过 jQuery ajax 从用户发送到服务器的输入时,我收到此错误“从客户端检测到具有潜在危险的 Request.Form 值”。只有当我故意在输入 ex "<s"c'o<>" 中添加一个单引号、双引号、html 字符作为我的用户名时,它才会出现。但是,我仍然希望能够优雅地编码和解码用户尝试输入的任何错误输入。

这里是客户端 jquery

    var email = encodeURIComponent($('#loginEmail').val());  
    var password = encodeURIComponent($('#loginPassword').val());

    $.ajax({
        async: false,
        url: 'Account/CheckLogin',
        dataType: 'JSON',
        contentType: 'application/json',
        data: {
            email: email,
            password: password
        },
        success: function (resp) {
            alert(resp.valid);
            if (resp.valid == "false") {
                isValid = false;
                $('.errorspan').show();
            }
        }
    });

控制器代码实际上并不重要,因为错误在到达第一行的断点之前就被抛出了。在我有机会处理代码之前,似乎 Asp.net 试图将其作为 ajax 传递。我的问题是 - 为什么 encodeUriComponent() 会发生这种情况??

【问题讨论】:

  • 每当有人键入$.ajax({ async: false... 时,一只可爱的小兔子死在某个地方可能更多......
  • 我绝对必须这样,这一次,对不起所有的兔子
  • 你的电话必须是get吗?可以发帖吗?
  • jQuery 会为您编码值,因此如果您对它们进行预编码,您会将 < 转换为 %3c,然后 jQuery 会转而将其转换为 %253c(25 是百分比符号的代码)。因此,当它最终到达服务器时,< 将不会出现在您的代码中 - %3c 会出现。所以我想说不要尝试自己编码,而是使用 MattW 关于关闭验证的建议,让框架处理编码。
  • 通过调用 encodeURIComponent 得到编码,你发送什么字符来阻塞 IIS?

标签: jquery asp.net ajax asp.net-mvc-3


【解决方案1】:

您需要关闭服务器端请求验证,例如查看here

至于为什么会这样?微软基本上假设任何不知道如何关闭请求验证的人也不能信任如果往返到数据库并放回页面而不考虑编码可能有害的数据。多年来,这可能拯救了很多人。 URI 编码不会“隐藏”来自 .NET 的“危险”',至少在 Firefox 中是这样。

【讨论】:

  • 关闭验证并不能解决问题,它会回避它,同时降低应用程序的安全性
  • 它本质上不会降低应用程序的安全性,它只是将安全责任从框架转移给开发人员。对数据进行 URI 编码并不比不这样做更“危险”,即使它确实可以解决问题,但事实并非如此。潜在的危险在于您将数据以未编码的形式处理后如何处理,无论是直接传递还是先编码然后解码,都是一样的。
  • 将责任转移给人类往往不太安全
  • @MattW 我与您同在 - 只要您始终在显示用户生成的文本时对其进行编码,无论数据是如何获取的,您都不会面临任何风险。 ASP.NET 实际上让这件事变得非常容易,在 ASP.NET 4.0 中引入了<%: %>,并使 HTMLEncoding 成为 Razor 的默认设置,如果您不想对文本进行编码,则必须明确告诉它。
  • 我不会打开内置验证,但我从 cmets 中找到了,谢谢
猜你喜欢
  • 2011-06-10
  • 1970-01-01
  • 2010-11-05
  • 2016-01-07
  • 1970-01-01
  • 1970-01-01
  • 2018-06-14
  • 2020-11-15
  • 1970-01-01
相关资源
最近更新 更多