ASP.NET MVC 3里面客户端输入验证的改动

简介:
最近在用 ASP.NET MVC 3 ,在通过 TinyMCE HTML 编辑器,向服务器端输入 HTML 代码时,收到了下面这个错误信息:

异常详细信息System.Web.HttpRequestValidationException: 从客户端(test="<a>adfasdf</a>")中检测到有潜在危险的Request.Form 值。

很明显,这是ASP.NET为了阻止跨站脚本攻击所实现的防御措施,然而在我的情况下,我的确需要ASP.NET临时关闭这个检查机制,因为这个时候我需要保存原始的HTML文本。在网上搜了一下,发现很多人的解决方案有点粗暴,要么是直接将整个站点的HTML跨站攻击检测机制禁止掉:

  1. web.config文件里,添加上<httpRuntime requestValidationMode="2.0" />
  2. 然后再<pages>节设置validateRequest="false" 禁用请求验证。

安全一点的,也是把整个页面的检测机制禁止掉—即通过在webform页面的Page指令禁用请求验证,或在MVCController上加上[ValidateInput(false)]属性。下面这个razor语法的页面就可以让你重现这个问题:


代码


 

MVC 3里,请求验证以及集成到HttpModule这一层了,也就是说,即使你用上面那两个方法,有可能还是禁用不了请求验证。这是因为上面两个方法是在处理Page的时候才有效,而HttpModulePage接收到请求之前就已经执行请求验证了。在MVC 3里,你可以告诉请求验证程序对一个字段忽略请求验证,但依然对其他字段执行请求验证。通过下面这条语句就可以指明你希望跳过验证的字段了—参数就是表单里输入控件的name属性值:


@{    
    var text 
=  Request.Unvalidated().Form[ " test " ];
}


另外,请注意Unvalidated这个函数,你只有在安装了WebMatrix Beta2以及ASP.NET MVC 3 RC后才有。

 

装好WebMatrix Beta 2,再次访问网页,你就可以看到在test文本框里输入的html字符串可以正常通过验证,但是在其他文本框输入的html字符串则不能通过验证。

 

但是,接下来又有另外一个问题,当你回显HTML字符串的时候,它并没有跟你想象的那样作为HTML代码插入,而被当作了普通文本输出,如下图:

 

这是因为,在MVC 3Razor引擎里,默认情况下,所有的字符串都会先被转义以后才能输出,也就是说,下面这段代码:

< div > text </ div >

 

实际上是被Razor引擎替换成下面的代码:

 

< div > @Server.EncodeHtml(text) </ div >

 

如果你需要修改这个行为,应该将代码改成下面这样:

 

var wrapper  =   new  HtmlString(text);
< div > @wrapper </ div >

 

下面是完整的代码(注意,你需要安装了WebMatrix Beta2以及ASP.NET MVC 3 RC才能顺利编译):

复制代码
ExpandedBlockStart.gif 代码
@{    
    var text = Request.Unvalidated().Form["test"];
}
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" >
< html  xmlns ="http://www.w3.org/1999/xhtml" >
< head >
    
< title > Sample Page </ title >
    
< script  src ="/Scripts/jquery-1.4.2.min.js"  type ="text/javascript" ></ script >
    
< script  type ="text/javascript"  src ="/Scripts/tinymce/tiny_mce.js" ></ script >
    
< script  type ="text/javascript"  src ="/Scripts/tinymce/jquery.tinymce.js" ></ script >
    
< script  language ="javascript"  type ="text/javascript" >
        $(document).ready(
function  () {
            $(
' #test ' ).tinymce({
                mode: 
" textareas " ,
                theme: 
" simple "
            });

        });
    
</ script >
</ head >

< body >
  
< form  method ="post"  action ="" >
    
< label  for ="test" > 测试 </ label >
    
< textarea  name ="test"  id ="test" >
    
</ textarea >
    
< br  />
    
< input  type ="submit"  value ="提交"   />
  
</ form >

  
< br  />
  @if ( IsPost ) {
      var wrapper = new HtmlString(text);
      
< div > @wrapper </ div >
  }
</ body >
</ html >
复制代码


 

本文转自 donjuan 博客园博客,原文链接: http://www.cnblogs.com/killmyday/archive/2010/11/17/1879996.html  ,如需转载请自行联系原作者


相关文章
|
5月前
|
Linux Android开发 iOS开发
基于.Net开发的ChatGPT客户端,兼容Windows、IOS、安卓、MacOS、Linux
基于.Net开发的ChatGPT客户端,兼容Windows、IOS、安卓、MacOS、Linux
88 0
|
3月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
41 0
|
1月前
|
开发框架 前端开发 .NET
进入ASP .net mvc的世界
进入ASP .net mvc的世界
29 0
|
1月前
mvc.net分页查询案例——mvc-paper.css
mvc.net分页查询案例——mvc-paper.css
5 0
|
1月前
|
开发框架 前端开发 .NET
C# .NET面试系列六:ASP.NET MVC
<h2>ASP.NET MVC #### 1. MVC 中的 TempData\ViewBag\ViewData 区别? 在ASP.NET MVC中,TempData、ViewBag 和 ViewData 都是用于在控制器和视图之间传递数据的机制,但它们有一些区别。 <b>TempData:</b> 1、生命周期 ```c# TempData 的生命周期是短暂的,数据只在当前请求和下一次请求之间有效。一旦数据被读取,它就会被标记为已读,下一次请求时就会被清除。 ``` 2、用途 ```c# 主要用于在两个动作之间传递数据,例如在一个动作中设置 TempData,然后在重定向到另
99 5
|
3月前
|
XML 前端开发 定位技术
C#(NET Core3.1 MVC)生成站点地图(sitemap.xml)
C#(NET Core3.1 MVC)生成站点地图(sitemap.xml)
25 0
|
3月前
|
前端开发
.net core mvc获取IP地址和IP所在地(其实是百度的)
.net core mvc获取IP地址和IP所在地(其实是百度的)
124 0
|
5月前
|
开发框架 自然语言处理 前端开发
基于ASP.NET MVC开发的、开源的个人博客系统
基于ASP.NET MVC开发的、开源的个人博客系统
52 0
|
8月前
|
存储 开发框架 前端开发
[回馈]ASP.NET Core MVC开发实战之商城系统(五)
经过一段时间的准备,新的一期【ASP.NET Core MVC开发实战之商城系统】已经开始,在之前的文章中,讲解了商城系统的整体功能设计,页面布局设计,环境搭建,系统配置,及首页【商品类型,banner条,友情链接,降价促销,新品爆款】,商品列表页面,商品详情等功能的开发,今天继续讲解购物车功能开发,仅供学习分享使用,如有不足之处,还请指正。
116 0
|
9月前
|
开发框架 前端开发 .NET
[回馈]ASP.NET Core MVC开发实战之商城系统(三)
[回馈]ASP.NET Core MVC开发实战之商城系统(三)
67 0