表单帖子上的 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, '<')
.replace(/>/g, '>');
根据您的需要,您可能希望使用内置的 Javascript 函数 encodeURI
转义所有字符或扩展上述函数,例如:
function htmlEscape(str)
return str
.replace(/&/g, '&')
.replace(/"/g, '"')
.replace(/'/g, ''')
.replace(/</g, '<')
.replace(/>/g, '>');
【讨论】:
【参考方案3】:您使用的是 .net 4.0 吗?如果是这样,您还需要
<system.web>'
<httpRuntime requestValidationMode="2.0"/>'
在您的 config.web 文件中。
【讨论】:
这会禁用整个站点的验证,这可能不是最佳做法。 @Darin 的回答是在 MVC 环境中禁用验证的正确方法。 Paul - 麻烦是@Darin 对 .net 4 的回答不完整以上是关于表单帖子上的 asp.net mvc 编码的主要内容,如果未能解决你的问题,请参考以下文章
ASP.net MVC - 视图上的多个表单,每个调用不同的操作,但需要再次显示相同的视图
手动编码 MVC 视图与 asp:ServerControls