表单帖子上的 asp.net mvc 编码

Posted

技术标签:

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

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

谢谢。

【问题讨论】:

【参考方案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 的回答不完整

以上是关于表单帖子上的 asp.net mvc 编码的主要内容,如果未能解决你的问题,请参考以下文章

asp.net mvc 3 - ajax 表单提交和验证

ASP.net MVC - 视图上的多个表单,每个调用不同的操作,但需要再次显示相同的视图

手动编码 MVC 视图与 asp:ServerControls

使用 ASP.NET MVC 和 Access 的 Intranet 表单

ASP.NET MVC 自动生成整数

如何在 ASP.NET MVC 中通过 Ajax 提交表单?