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

2024-03-28

我的强类型视图中有一个 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 中输入的文本被传递到控制器中,并通过实体框架保存到 SQL Server 中的 Post 表中。该字段的数据类型为 varchar(1000)。 (还使用带有 [StringLength(1000)] 验证的 MetadataType 对文本字段进行模型验证。)

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

“从客户端检测到潜在危险的 Request.Form 值”

这个错误导致我这个问题 https://stackoverflow.com/questions/81991/a-potentially-dangerous-request-form-value-was-detected-from-the-client,从中得到的好处是我可以简单地添加

[HttpPost, ValidateInput(false)]

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

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


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

如果您要关闭验证,则必须非常小心,以确保在显示所有用户输入时对所有用户输入进行编码,以免由于用户输入的内容而无意中在页面上运行一些 javascript(请参阅 XSS 以获取一些示例) 。

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

此外,即使您不显示用户数据,它也可能会产生影响,具体取决于您如何访问数据。

即使您使用实体框架之类的东西,例如,如果您使用存储过程并且没有对输入进行验证检查,您也不会受到 SQL 注入的保护。参见特洛伊亨特的article http://www.troyhunt.com/2012/12/stored-procedures-and-orms-wont-save.html on this

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MVC 使用 [HttpPost, ValidateInput(false)] 的副作用 的相关文章

随机推荐