7

我的强类型视图中有一个 TextArea 定义为

@Html.TextAreaFor(x => x.Text)

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

[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 对 Text 字段进行模型验证。)

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

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

这个错误让我想到了这个问题,从中得到的收获是我可以简单地添加

[HttpPost, ValidateInput(false)]

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

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

4

1 回答 1

9

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

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

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

此外,即使您没有显示用户数据,它也可能会根据您如何访问数据而产生影响。

即使您使用实体框架之类的东西,您也不会受到 sql 注入的保护,例如,如果您使用存储过程并且没有对输入进行验证检查。请参阅 Troy Hunt关于此的文章

于 2013-02-25T04:22:36.933 回答