服务器返回内部服务器错误/危险 Request.Form 值

Server returns Internal Server Error / Dangerous Request.Form value

提问人:David T. Macknet 提问时间:10/25/2023 最后编辑:David T. Macknet 更新时间:11/11/2023 访问量:172

问:

MVC项目,已经存在了很长一段时间,庞大的单体。我希望我在这里遗漏了一些东西。

我有一个通过ajax提交的表单。它到达服务器,被存储起来,然后我去向客户端返回一个对象(基本上是状态和目标URL)。

如果表单输入中有任何包含非法字符(html-ish)的内容,那么它就会给我带来关于可怕数据的错误。

  • 我试过把视图模型的每个文本字段都放在上面(不会是长期的)。[AllowHtml]
  • 我已经添加了控制器方法[ValidateInput(false)]
  • 删除了所有警报(因为它正在保存数据)。

愚蠢的是它保存了数据。“危险”数据进入服务器和数据库,然后返回到控制器方法。我似乎无法捕捉到这一点, - 我已经将它调试到我从控制器发货的地方,然后在浏览器中出现错误。

var form = $(this).parents('form:first').serializeObject();

$.ajax({
    type: "POST",
    url: '@Url.Action("EditAjax", "Item", new {area = "ProjectSupport"})',
    dataType: "json",
    data: form,
    ignoreErrors: true,
    success: function(result) {
    var formData = new FormData($('#editItem')[0]);
    if (result.Errors) {
        //alert(result.Errors);
        $('form').find('a.submit,#saveFormButton1,#saveFormButton2').removeClass('btn-inverse').addClass('btn-primary');
        submitted = false;
    } else {
        formData.append("supportObjectTypeName", result.SupportObjectTypeName);
        formData.append("supportObjectLocalizedID", result.SupportObjectLocalizedID);

        url = result.Url;

        $.ajax({
        type: "POST",
        url: '@Url.Action("UploadAttachments", "Item", new {area = "ProjectSupport"})',
        dataType: "json",
        mimeType: "multipart/form-data",
        contentType: false,
        cache: false,
        processData: false,
        data: formData,
        ignoreErrors: true,
        success: function() {
            window.location.href = url;
        },
        error: function (xhr, ajaxOptions, thrownError) {
            //alert(thrownError);
            //$('form').find('a.submit,#saveFormButton1,#saveFormButton2').removeClass('btn-inverse').addClass('btn-primary');
            //submitted = false;
            window.location.href = url;
        }
        });
    }
    },
    error: function(xhr, ajaxOptions, thrownError) {
    alert(thrownError);
    alert(xhr.responseText);
    var fullErrorText = [];
    $.each(xhr.responseJSON, function() {
        fullErrorText.push(this.errors.join());
    });
    alert(fullErrorText.join());
    $('form').find('a.submit,#saveFormButton1,#saveFormButton2').removeClass('btn-inverse').addClass('btn-primary');
    submitted = false;
    }
});

我以前使用过 AllowHtml,它工作得很好 - 把它拍到模型上,你就很好了。不过,我刚刚在这个问题上花了几个小时,我希望有人在这方面比我更聪明(我敢肯定)。

有什么想法吗?

顶级域名:

  • 我试过把视图模型的每个文本字段都放进去。[AllowHtml]
  • 我添加了控制器方法(还构建了一个自定义过滤器,只是......抓住稻草)。[ValidateInput(false)]
  • 删除了所有警报(因为它正在保存数据)。
  • 按照@queeny的建议尝试。Request.Unvalidated

思潮:

  • 命名空间已经更改了它们的默认值或其他东西,因为以前编译的东西一直在抱怨名称冲突。
  • EF 遇到了一些问题,但命名问题可能是最严重的。
  • 收到通常的“我在缓存中留下了一些东西,懒得修复它”消息,中断了构建。
  • CDN 在 debug 和 prod 之间有一个不同的 URL,没有对此进行转换。web.config
  • 我没有办法进行包更新(好吧,我做到了,但这很残酷)。
  • 编译器也发生了变化(版本 1.x 到 4.x)。
  • 我玩过各种属性,但那里没有乐趣。

我认为很可能是处理让我度过难关的命名空间问题。如果我选择我当天的迷信。

javascript ajax asp.net-mvc

评论

1赞 jQueeny 10/29/2023
这个答案有帮助吗?这个问题有几个古老但很有希望的线索。
1赞 David T. Macknet 10/29/2023
谢谢你,@jQueeny!我会在周一或周二看一看,但那里有一些有希望的回应。我已经尝试了允许 HTML 的,基本上是熟悉的。不过,这个问题有一个不同的解决方案。这个答案看起来很有趣:stackoverflow.com/a/50796666/6850
0赞 David T. Macknet 11/5/2023
嘿,@jQueeny - 请将其格式化为答案,我会接受您的评论作为答案。
0赞 jQueeny 11/5/2023
那你修好了吗?
1赞 jQueeny 11/6/2023
祝你好运。我最近用 Laravel 构建了单体,我对这个框架赞不绝口。让我想起了Ruby on Rails,但更好。如果可以选择将其移植到另一个 MVC,那么一定要看看 Laravel。

答:

0赞 jQueeny 11/5/2023 #1

您可以尝试答案中提到的方法。Request.Unvalidated

评论

0赞 David T. Macknet 11/8/2023
我会试一试。我最终创建了一个全新的 MVC 站点,复制了所有区域内容,重新创建了所有 EF 模型,现在正在解决 EF 模型中的所有错误。
0赞 jQueeny 11/8/2023
@DavidT.Macknet Pfft!这听起来像是很多工作。如果您解决了这个问题,请发布。
0赞 David T. Macknet 11/8/2023
我到17号!我目前在install-package上收到错误,似乎是关于编译器的。我的部分问题是更改路径 - 我没有正确嵌套它们,所以我所有的包路径都搞砸了。呵呵。还是没有解决。今天是寻找错误的一天。呸。
0赞 David T. Macknet 11/8/2023
克服了错误,这些错误主要与实体框架搞砸了有关。我认为这与嵌套有关,但也与 EF 保留多个版本的文件有关,因此添加一些文件会捣碎项目文件中的文件引用。将错误拉出到记事本++中并对其进行清理和重复数据删除,这样就更容易找到。不过,处理起来并不“容易”。我已经花了 2.5 天来修复这个,现在必须测试一个新功能(是的,我在 10 年前写了这个东西,所以我可以在 5 年的 95% 编码时间的产品中添加一个功能)