我在我的强类型视图中定义了一个TextArea
@Html.TextAreaFor(x => x.Text)
Run Code Online (Sandbox Code Playgroud)
我的控制器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();
}
Run Code Online (Sandbox Code Playgroud)
这很好.用户输入TextArea的文本被传递到控制器并通过Entity Framework保存到SQL Server的Post表中.该字段的数据类型是varchar(1000).(使用带有[StringLength(1000)]验证的MetadataType在Text字段上还有模型验证.)
我注意到如果我尝试复制一些HTML源并将其粘贴到TextArea并提交它,我收到以下错误:
"从客户端检测到一个潜在危险的Request.Form值"
这个错误让我想到了这个问题,从中可以看出我可以简单地添加
[HttpPost, ValidateInput(false)]
Run Code Online (Sandbox Code Playgroud)
我的行动停止这种类型的验证.这非常有效,但令我惊讶的是,无论我尝试放入TextArea,我都不会引起任何问题.如果我粘贴javascript,html或带有引号字符的T-SQL语句,它仍然可以正常工作.我看到我进了出现在SQL表中的文本区域的确切角色,如果我显示的文字回的看法,我看到在源中的每个字符转换为HTML对应,并在屏幕上显示看起来就像当我进入它时它就会这样做.我没有做任何文本转换来实现这一点.默认情况下,一切都按照我的要求完成.当然我很高兴这一点,但是当我读到关于禁用验证时,通常会发出警告,你应该理解这样做的后果,我不认为我这样做.所以我想知道,后果是什么?是否有人可能在我的TextArea中输入任何可能因禁用输入验证而搞砸的内容?
如果它是相关的,我的特定设置是MVC4,.NET 4.0,实体框架4.4,SQL Server 2012 Express.
如果您使用剃刀,您输出的任何文本都将自动编码,这些文本将在浏览器中显示为文本,但不会被解释为javascript等.
如果你要关闭验证,你必须非常小心,确保你编码所有用户输入,只要你显示它,这样你就不会因为用户输入的某些东西而无意中在你的页面上运行一些javascript(查看XSS的一些例子) .
您可以通过向数据库中的各种varchar字段添加某种javascript警报('hello')调用来快速测试(尽管不是详尽的搜索),并查看它是否在您访问该页面时被调用.
即使您没有显示用户数据,也可能会产生影响,具体取决于您进行数据访问的方式.
即使您使用类似实体框架的东西,例如,如果您使用存储过程并且未对输入进行验证检查,则不会受到sql注入的保护.请参阅Troy Hunt 关于此的文章
| 归档时间: |
|
| 查看次数: |
8295 次 |
| 最近记录: |