2013-02-25 57 views
7

我有MVC副作用

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

我控制器操作定义在我的强类型查看一个TextArea原本看起来与此类似:

[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)。 (在使用MetadataType和[StringLength(1000)]验证的文本字段上也有模型验证。)

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

错误导致我this question“从客户端检测到有潜在危险的Request.Form值”,并从那里是我可以简单地添加拿走

[HttpPost, ValidateInput(false)] 

我的行动停止这种类型的验证。这很有效,但是对我的臆测,无论我尝试将其放入TextArea中,我都不会造成任何问题。如果我在javascript,html或T-SQL语句中粘贴引号字符,它仍然可以正常工作。我看到了我在SQL表中出现的TextArea中输入的确切字符,并且如果将文本显示回View,我会在源代码中看到每个字符都转换为HTML对手,并且屏幕上的显示看起来就像它是在我输入时进行的。我没有做任何类型的文本转换来完成此操作。在默认情况下,一切正如我所愿。当然,我对此感到高兴,但是当我阅读关于禁用验证的信息时,通常会发出警告,告知您应该了解这样做的后果,我认为我不这样做。所以我想知道,后果是什么?有没有什么人可能会输入到我的TextArea,可能会因为禁用输入验证而导致混乱?

如果相关,我的特殊设置是MVC4,.NET 4.0,实体框架4.4,SQL Server 2012 Express。

回答

9

如果您使用的剃须刀,你的输出将自动编码的任何文本将出现在浏览器中的文本,但不被理解,如JavaScript等

如果关闭验证过,你必须非常小心以确保您编码的所有用户输入都显示出来,这样您就不会因为用户输入的某些内容而在您的页面上无意中运行某些JavaScript(请参阅XSS中的某些示例)。

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

此外,即使您不显示用户数据,它可能会影响取决于您如何进行数据访问。

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

+0

谢谢。这正是我正在寻找的信息。 – TTT 2013-02-25 15:58:13

+0

加入了链接,发誓它原来! – 2013-02-25 23:58:33