【问题标题】:asp.net mvc encode on form post表单帖子上的 asp.net mvc 编码
【发布时间】:2011-02-13 05:37:13
【问题描述】:

我在我的 asp.net mvc 表单(带有 textarea 的 nicedit)中使用富文本编辑器,当我在 post 上提交表单时,因为它不是 html 编码的,我收到以下消息: “从客户端检测到有潜在危险的 Request.Form 值”。 如何对 post 上的 textarea 进行 html 编码?我不想取消验证。 有没有办法在提交时使用 html.encode 助手?

谢谢。

【问题讨论】:

    标签: javascript jquery asp.net-mvc validation encoding


    【解决方案1】:

    您可以使用ValidateInputAttribute 装饰处理表单帖子的操作:

    [ValidateInput(false)]
    [HttpPost]
    public ActionResult SomeActionToHandleFormSubmission() 
    {
        ...
    }
    

    【讨论】:

    • 感谢您的回答,但我不想取消验证。我想在提交之前对其进行编码。无论如何,即使我把属性它仍然给我服务器错误。
    • 即使帖子经过编码,ASP.NET 也可能触发此异常,因为它旨在防止用户发布危险内容,然后您将这些内容显示给其他用户。由于您几乎肯定会在显示之前对其进行解码,因此 ASP.NET 必须验证已解码的内容以使保护具有任何价值。将 ValidateInput 属性添加到 POST 操作方法中,您告诉 ASP.NET 您知道自己在做什么,并将采取适当的措施来确保提交的内容是安全的。
    • 我需要采取哪些适当的措施来确保提交的内容是安全的?
    • 安全有什么用?当您要渲染用户输入的文本时,只需将其传递给Html.Encode
    • 这是我不完全同意 ASP.NET MVC 设计的地方。 IMO,它旨在挫败用户和开发人员。我认为正确的方法是 MVC 应该自动编码数据而不是抱怨。与其假设开发人员知道该做什么,MVC 应该做一些事情来确保此类 XSS 攻击不太可能发生。不过,我不能说我对这个答案感到满意。必须有一种方法可以在保存之前对表单数据进行编码......
    【解决方案2】:

    而不是关闭 ValidateInput ,因为那样你容易受到漏洞的影响,你可以使用 Javascript 对特殊字符进行编码。这使您不会抛出错误消息:

    从 客户

    对于一些简单的输入(例如MyName<me@somewhere.com> 格式的电子邮件),但仍然具有内置的 MVC 功能来监视您的其他脚本注入。当然,如果您需要在服务器上以正确格式输入,则必须对其进行解码,并且在再次输出时要小心

    如果已经在使用 jQuery,可以很容易地将它添加到所有输入字段中,如下所示

    $("input").on("change", function() {
        $(this).val(htmlEscape($(this).val()));
    });
    

    htmlEscape 这是我自己更改特殊字符的函数。

    function htmlEscape(str) {
        return str
            .replace(/</g, '&lt;')
            .replace(/>/g, '&gt;');
    }
    

    根据您的需要,您可能希望使用内置的 Javascript 函数 encodeURI 转义所有字符或扩展上述函数,例如:

    function htmlEscape(str) {
        return str
            .replace(/&/g, '&amp;')
            .replace(/"/g, '&quot;')
            .replace(/'/g, '&#39;')
            .replace(/</g, '&lt;')
            .replace(/>/g, '&gt;');
    }
    

    【讨论】:

      【解决方案3】:

      您使用的是 .net 4.0 吗?如果是这样,您还需要

      <system.web>' 
      <httpRuntime requestValidationMode="2.0"/>'
      

      在您的 config.web 文件中。

      【讨论】:

      • 这会禁用整个站点的验证,这可能不是最佳做法。 @Darin 的回答是在 MVC 环境中禁用验证的正确方法。
      • Paul - 麻烦是@Darin 对 .net 4 的回答不完整
      猜你喜欢
      • 1970-01-01
      • 2018-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-20
      • 1970-01-01
      • 2015-09-08
      • 1970-01-01
      相关资源
      最近更新 更多