使用[HttpPost,ValidateInput(false)]的MVC副作用

时间:2013-02-25 04:16:26

标签: asp.net-mvc

我在用

定义的强类型视图中有一个TextArea
@Html.TextAreaFor(x => x.Text)

我的控制器动作最初看起来与此类似:

[HttpPost]
public ViewResult Index(MyViewModel vm)
{
    using (var db = new MyEntities())
    {
        Post p = new Post();
        p.Text = vm.Text;
        db.Posts.AddObject(p);
        db.SaveChanges();
    }
    return View();
}

这很好用。用户输入TextArea的文本被传递到控制器并通过Entity Framework保存到SQL Server的Post表中。该字段的数据类型是varchar(1000)。 (使用带有[StringLength(1000)]验证的MetadataType对Text字段进行模型验证。)

我注意到如果我尝试复制一些HTML源并将其粘贴到TextArea并提交它,我收到以下错误:

“从客户端”

检测到一个潜在危险的Request.Form值

错误导致我this question,从那里拿走了我可以简单地添加

[HttpPost, ValidateInput(false)]

到我的Action停止这种类型的验证。这非常有效,但令我惊讶的是,无论我尝试放入TextArea,我都不会引起任何问题。如果我粘贴javascript,html或带有引号字符的T-SQL语句,它仍然可以正常工作。我在SQL表中看到我输入TextArea的确切字符,如果我将文本显示回View,我在源代码中看到每个字符都转换为HTML对应字符,屏幕上的显示看起来就像当我进入它时它就会这样做。我没有做任何文本转换来实现这一点。默认情况下,一切都按照我的要求完成。当然我很高兴这一点,但是当我读到关于禁用验证时,通常会发出警告,你应该理解这样做的后果,我不认为我这样做。所以我想知道,后果是什么?是否有人可能会在我的TextArea中输入任何因为禁用输入验证而导致混乱的内容?

如果它是相关的,我的特定设置是MVC4,.NET 4.0,Entity Framework 4.4,SQL Server 2012 Express。

1 个答案:

答案 0 :(得分:9)

如果您使用剃刀,您输出的任何文本都将自动编码,这些文本将在浏览器中显示为文本,但不会被解释为javascript等。

如果你要关闭验证,你必须非常小心,确保你编码所有用户输入,只要你显示它,这样你就不会因为用户输入的某些东西而无意中在你的页面上运行一些javascript(查看XSS for一些例子)。

您可以通过向数据库中的各种varchar字段添加某种javascript警报('hello')调用来快速测试(尽管不是详尽的搜索),并查看它是否在您访问该页面时被调用。

即使您没有显示用户数据,也可能会产生影响,具体取决于您的数据访问方式。

即使您使用类似实体框架的内容,例如,如果您使用存储过程并且未对输入进行验证检查,则不会受到sql注入的保护。在此

上查看Troy Hunt的article