当前位置: 永利皇宫手机版网址 > www.304.com > 正文

Web安全相关(一):跨站脚本攻击(XSS)

时间:2019-10-23 11:45来源:www.304.com
简介 跨站脚本攻击(克罗斯Site Scripting),为不和层叠样式表(Cascading Style Sheets,CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里布署恶意Script代码,当客商浏览该页之

简介
  跨站脚本攻击(克罗斯Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里布署恶意Script代码,当客商浏览该页之时,嵌入当中Web里面的Script代码会被推行,进而完成恶意抨击客户的特殊目标,比如获取顾客的Cookie,导航到黑心网址,指点木马等。

Web安全相关(一):跨站脚本攻击(XSS)。部分情景

  1. 恶心攻击者可以在个体介绍当中插入恶意代码,那么其余客户访谈他的个人音信时,就能实行恶意代码。
  2. 黑心攻击者能够发表生机勃勃篇小说,取三个抓住眼球的标题,在剧情里布署恶意代码,那么客商查看那篇小说时,就能实行恶意代码。
  3. 黑心攻击者在部分销路好小说或帖子里的过来或留言中插入恶意代码,那么顾客浏览到他的卷土重来或留言时,就能实行恶意代码。

防护XSS的多少个级次

  1. 提交数据时,就对数据开展验证,如果带有恶意脚本,则不让数据进库,ASP.NET MVC暗中同意是会做这一个注脚。如下图,假若计划插入恶意脚本,就能够博得三个HttpRequestValidationException。注爬山涉水图2深橙框中的方法后续会涉及。

     图片 1

                  图1

     图片 2

Web安全相关(一):跨站脚本攻击(XSS)。                  图2

  假设大家要求允许脚本入库,能够在对应的Action上助长[Web安全相关(一):跨站脚本攻击(XSS)。ValidateInput(false)]。此时恶意脚本还无法产生威慑,因为还恐怕有前面三个级其余防守措施。

      图片 3

Web安全相关(一):跨站脚本攻击(XSS)。                  图3

      图片 4

                    图4

 2. 输出数据时,对输出的剧情接收HTML编码,恶意脚本不会被实行。并且,MVC的Razor语法暗中同意就利用HTML编码。不过若是大家采纳Html.Raw()来输出内容的话,恶意脚本就能生出吓唬。

      图片 5

                 图5

     图片 6

                 图6

 一些恶心脚本

  1. 简易的弹窗或许内容显示。
  <script>alert('你被黑了!')</script>
 
  2. 导航到黑心网址。注爬山涉水这里只是采取百度网址作为导航演示,并不是说百度网站是黑心网址。
    <script>window.location.href=';
 
  3.  获取cookies。
  <script>alert(document.cookie)</script>
  <script>window.location.href=';

 $.ajax数据印证失效?

  我们只要大家的须要是不允许含有恶意脚本的数目进库的,然而大家应用了jquey的ajax实行交互。

      图片 7

                图7

      图片 8

                图8

      图片 9

                图9

      图片 10

              图10

  数据恐怕进库,为啥吧?大家来研商下图2红框中的方法。

      图片 11

                图11

      图片 12

                图12

  从图1第22中学,小编推测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集成进来了。假使是别的版本则供给引进。

源码下载

  为了方便使用,作者没有使用别的数据库,而是用了贰个文件来储存数据。代码下载后得以间接运维,不必要配置。

  下载地址跋山涉水的近义词

  图片 16

 

文章转发自爬山涉水

编辑:www.304.com 本文来源:Web安全相关(一):跨站脚本攻击(XSS)

关键词: