XSS的那些事儿

转载自 XSS的那些事儿


XSS是什么


XSS,Cross-site scripting,跨站脚本攻击,为了区分与CSS,起名为XSS。黑客利用网站的漏洞,通过代码注入的方式将一些包含了恶意攻击脚本程序注入到网页中,企图在用户加载网页时执行脚本来实施攻击。脚本程序通常是JavaScript编写,当然还包括Java,VBScript,ActiveX等。常见的攻击手段是获取用户身份认证信息(Cookie,Session)、获取私密网页内容、植入病毒等。

XSS漏洞可以追溯到1990年代。Twitter,Facebook,MySpace,Orkut,新浪微博和百度贴吧这些网站曾遭受XSS漏洞攻击或被发现此类漏洞。而最近几年XSS升级为最流行的攻击方式,有68%的网站可能遭受此类攻击。根据开放网页应用安全计划(Open Web Application Security Project)公布的2010年统计数据,在Web安全威胁前10位中,XSS排在第2位,仅次于代码注入。


场景还原


XSS是之所以能成功在于黑客注入的脚本程序在网页上得到执行,那么它是怎么被注入?又是如何被执行的?我们来躺枪一次XSS攻击就知道怎么回事了。

忙碌的一天过去了,下班后我打开博客,准备写篇《XSS的那些事儿》。于是乎我偷偷的在内容处写入了以下代码:


<script>alert('I am a xss hacker.')</script>


提交发布博客后,我查看网页的博客内容,页面刷新时,就会弹出一个对话框:



之所以会弹出这个对话框,是因为我刚写在内容中的那行JavaScript代码被执行了(注入的代码被执行)。我尝试把这行代码push到GitHub Page博客的Repository上,我就会遇到这种问题。它只是一句简单的警告弹框,用户登录后的网站中嵌入下面代码又会发生什么呢:


<script>
    var cockie = window.cockie; // localStorage, sessionStorage
    // Send cockie|localStorage|sessionStorage information to hacker
</script>


如果我访问的博客网站使用了JWT做用户认证,将Token保存在sessionStorage(cookie或 localStorage)中,而我无意间访问了一个包含上述脚本的网页,我的身份认证信息就会被黑客窃取,后续的事情就不得而知了。


XSS家族体系


根据XSS的表现形式和存储形态,XSS主要分为三类反射性、持久型和基于DOM三种类型。而基于DOM型和反射型本质上又是一种类型。


反射型


XSS攻击最开始出现是在那种服务器负责处理所有数据的网站中。比如一个Servlet+JSP的网站,服务器在处理完用户的输入(包含XSS)之后会将结果作为一个页面(包含XSS)返回给用户,XSS就会立即被执行,该类型就是典型的反射型XSS。

反射性是XSS中最基本的攻击,用户输入(包含XSS)通常附加在HTTP查询参数或者表单上,提交请求后,服务器直接返回结果就立即执行执行XSS。

反射型的攻击主要针对个人用户。黑客通常通过邮件发送包含一些看似没有问题的URL(诱饵)给用户,用户点击这些URL后就会跳转到一个隐藏着XSS攻击的网站。


持久型


我们知道反射型XSS需要使用诱惑用户针对的是个人用户,它的危害和波及范围是可控的。而XSS被持久化到服务器数据库中后,影响范围就不再可控了。来回顾前文获取cookie的XSS脚本:


<script>
    var cockie = window.cockie; // localStorage, sessionStorage
    // Send cockie|localStorage|sessionStorage information to hacker
</script>


如果该脚本被作为一篇博客文章的内容被原样持久化到服务器端的数据库中,之后任何用户在浏览该博客文章的时候都会触发浏览器执行该脚本,用户的身份信息便会被盗走。

这种持久化在服务器端的XSS就是一种持久型的XSS攻击,它的影响范围是很广。因为一旦被持久化到服务器,该博客网站的任何用户都有可能遭遇攻击。


基于DOM


随着Web的发展,页面承载了越来越多的展现逻辑,那么为了提高用户体验,页面的渲染由同步转向异步,架构师开始采用JavaScript+AJAX的方案。之后JavaScript就逐渐掌管页面中数据请求和逻辑渲染。

JavaScript同时会处理用户输入并将其渲染出来。如果用户输入包含了XSS,此时XSS会以DOM的形式被执行。而这种XSS攻击我们称之为基于DOM型。

基于DOM型是由反射型衍生出来的一种新的类型,不同于反射型的是,后者需要服务器端的反射,而前者不会涉及跟服务器的交互。但它们本质上是一种类型,只是因为系统架构的演变而不得不进行基因变异。


防御措施


当我们使用cookie的时候,我们要防范CSRF,当我们使用了Token的时候,我们又得防范XSS,有种Web世界太危险,我要转后端(服务器端)开发的姿态。不巧的是,恰恰从服务器端去阻止XSS攻击才是有效的途径。

XSS的家族体系中可以看出XSS其实就是用户输入寄生虫,所以只要能对症下药,正确处理用户输入,就能防御绝大部分XSS攻击,甚至使其无地容身。


双重校验


对于用户输入,我们始终要保持怀疑的态度。要消除这种怀疑,我们要在浏览器端和服务器端做双重严格校验。

在安全架构方面,我们对JavaScript的定位是仅用于提高用户体验。所以浏览器校验只是用来防君子,根本上需要在服务器端搭设一层可靠的防御网。针对双重校验,我们可以的事情主要有:

1.严格控制输入的格式,比如年龄的input中,只允许用户输入数字。 2.对数据进行HTMLEncode处理,对URL进行URLEncode。

3.过滤或移除特殊的HTML标签。例如: <script>,<iframe>,&lt; 

for <,&gt;for >, &quot for等。

4.过滤JavaScript事件的标签。例如"οnclick=","onfocus"等


Web Framework在这方面一般都集成了XSS防御功能,比如Spring Security就提供了配置http.headers().xssProtection()的选项。


注入猴子


当我们处在危险境遇,我们不能坐以待毙。提前做一些主动的安全防御措施是绝对有必要的。比如说引入一些自动化的XSS监测机制。

借鉴著名的Netflix猴子军的做法:

混乱猴子(Chaos Monkey):

负责在一天随机停掉服务器。


混乱大猩猩(Chaos Gorilla):

负责随机关闭整个可用区(数据中心)。


延迟猴子(Latency Monkey):

则负责下系统之间注入网络延迟。


Netflix的猴子军的目标是在生产环境的制造故障,来锻炼团队对故障的应对能力。它核心理念:从错误中学习成长。所以我们既然要防御XSS,不妨引入一直注入猴子(Injectiion Monkey),它主要负责向我们的网站中注入类似脚本:


"/><script>alert(document.cookie)</script><!--
<script>alert(document.cookie)</script><!--
"
onclick="alert(document.cookie)


特殊保护


XSS通常会盗用用户身份信息,如果网站使用了Cookie中保存用户Session的机制,则需要将重要的Cookie设置为httponly,即不让JavaScript脚本去读取Cooike信息。使用这种机制需要防范CSRF攻击。如果你的网站使用了Token机制,则需要重点实施上述两条措施。



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/329796.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js 时间戳转换成时间_JavaScript 时间戳转成日期格式

我们在开发中经常需要把时间戳转化成日期格式&#xff0c;但 JavaScript 本身自带的 Date 方法并不像 PHP date 的那么强大。因此&#xff0c;我们就需要自己动手写一个方法。首先我们要先了解下需要用到的 JavaScript 自带的 Date 对象的方法&#xff1a;getDate&#xff1a;获…

java阻塞队列小结

【README】 1&#xff0c;本文介绍了java的7个阻塞队列&#xff1b; 2&#xff0c;阻塞队列的作用 做缓冲作用&#xff0c;如缓冲kafka消息&#xff0c;而不是直接发送给kafka&#xff0c;减少kafka集群的压力&#xff1b;【1】阻塞队列 BlockingQueue 概述 1&#xff0c;队…

来自.NET FM的感谢信

掐指一算&#xff0c;我们的播客 .NET FM 已经上线一周了&#xff01;&#xff01;&#xff01;不过瞅下节节攀升的流量&#xff0c;二位主播一边感叹 .NET 中文社区的热情&#xff0c;一边摸了摸瘪下去的荷包&#xff1a; • 首日访问 > 2000人次 • 五日访问 > 5000人次…

并发场景下MySQL存在的问题及解决思路

转载自 并发场景下MySQL存在的问题及解决思路 目录1、背景2、表锁导致的慢查询的问题3、线上修改表结构有哪些风险&#xff1f;4、一个死锁问题的分析5、锁等待问题的分析6、小结 一、背景对于数据库系统来说在多用户并发条件下提高并发性的同时又要保证数据的一致性一直是数据…

python queue 生产者 消费者_【python】-- 队列(Queue)、生产者消费者模型

队列(Queue)在多个线程之间安全的交换数据信息&#xff0c;队列在多线程编程中特别有用队列的好处&#xff1a;提高双方的效率&#xff0c;你只需要把数据放到队列中&#xff0c;中间去干别的事情。完成了程序的解耦性&#xff0c;两者关系依赖性没有不大。一、队列的类型&…

关于.NET技术前途问题的讨论

我去年曾经在论坛发起过关于.NET技术前途问题这个话题的讨论&#xff0c;也引起了很多同行和朋友的回复&#xff0c;时间过去大半年&#xff0c;自己也有了一些新的理解。本文的目的就是将其中一些精彩的观点整理出来并谈谈自己的观点。 引子 我们都知道微软.NET技术更新速度快…

用枚举enum实现单例

【README】 1&#xff0c;effectivejava 讲到使用 枚举类实现单例的例子&#xff0c;非常好用&#xff1b;2&#xff0c;好处如下&#xff1a; 不用定义私有构造器&#xff1b;不用定义获取单例的方法&#xff0c;如 getInstance() &#xff1b;通过 枚举类.INSTANCE() 就可以…

前端面试常考系列一

转载自 前端面试常考系列一 一、简述HTML5的优点和缺点&#xff1f; 优点&#xff1a; 1、网络标准统一、HTML5是由W3C推出的。 2、多设备、跨平台 &#xff0c;移植性强。 3、自适应网页设计。 4、即时更新。 5、新增了几个标签&#xff0c;有助于开发人员定义重要的内容&…

基于轻量型Web服务器Raspkate的RESTful API的实现

在上一篇文章《Raspkate - 基于.NET的可运行于树莓派的轻量型Web服务器》中&#xff0c;我们已经了解了Raspkate这一轻量型Web服务器&#xff0c;今天&#xff0c;我们再一起了解下如何基于Raspkate实现简单的RESTful API。 模块 首先让我们了解一下“模块”的概念。Raspkate的…

python股票自动买卖视频教程_十分钟学会用Python交易股票

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼本文通过讲述 [单股票均线策略] 在 Ricequant 量化平台的实现&#xff0c;熟悉平台并快速入门、创建自己的量化策略代码 。难易度&#xff1a;入门级.从一下几点说起&#xff1b;1 确定框架&#xff1a;[单股票均线策略] 的主要策略…

前端面试常考系列二

转载自 前端面试常考系列二 一、外部引用CSS有几种方式&#xff0c;有何区别 外部引用CSS的方式有两种分别是link和import。 区别如下&#xff1a; 1、link是XHTML标签&#xff0c;除了加载CSS外&#xff0c;还可以定义RSS等其它事务&#xff1b;import属于CSS范畴&#xff0c;…

3分钟看完Build2016 Day 1 Keynote

Build 2016 Day 1 Keynote 直播结束&#xff0c;M姐不得不说&#xff0c;没看直播的真心错过了一大波黑科技和充值我软信仰的大好时机&#xff0c;不过别后悔&#xff0c;M姐精选了干货&#xff0c;一次性让你补充信仰。没看的真心会被甩开八条街&#xff01;&#xff01; 言归…

js动态给按钮赋id_如何给SHOPIFY店铺添加“立即购买”动态结账按钮

动态结账按钮会根据店铺后台所支持的第三方快速结账付款方式和顾客设备浏览器的记录动态展示快速结帐按钮&#xff0c;比如PayPal Express Checkout、Apple Pay等。当然如果浏览器没有记录或者店铺后台没有支持的快速结帐付款方式&#xff0c;按钮则会显示为“buy it now”。Dy…

java序列化与深度拷贝

【README】 1&#xff0c; 为啥要序列化或序列化的意义&#xff1f;2&#xff0c;系统间调用的报文格式&#xff0c;大多数是Json字符串&#xff08;或字节数组&#xff09;&#xff1b;接收方接收json&#xff1b;3&#xff0c;但当系统调用如RMI&#xff0c;客户端请求服务器…

微软Build 2016开发者大会--兑换承诺

微软的Build开发者大会已经成为它向我们宣布其在未来一年里的战略方向的一个最大平台。不像苹果的发布大会&#xff0c;微软之所以要召开这个会议并不是要发布什么产品&#xff0c;而是像众多业内人士所分析的那样&#xff0c;希望通过介绍公司的努力来说服它最重要的听众——开…

前端面试常考系列三

转载自 前端面试常考系列三 一、简述一下src与href的区别 href 表示超文本引用&#xff0c;在 link和a 等元素上使用。src 表示来源地址&#xff0c;指向外部资源所在位置&#xff0c;在 img、script、iframe 等元素上。src 的内容&#xff0c;是页面的一部分&#xff0c;是引入…

java内部类小结

【README】 1&#xff0c;本文总结了java4种内部类&#xff0c;包括 成员内部类&#xff1a;在外部类内部定义的非静态类&#xff1b;成员内部类不能独立存在&#xff0c;如 UML中类间的组合关联关系&#xff1b;静态内部类&#xff1a;在外部类内部定义的静态类&#xff1b;…

python内置模块有哪些_python中那些小众但有用的内置模块

今天带来的是python里一些小众但是却比较实用的python库&#xff0c;一起来看看吧&#xff01;pprint&#xff1a;更清晰的打印pprint 是 pretty printer 的缩写&#xff0c;用来打印 Python 数据结构&#xff0c;与 print 相比&#xff0c;它打印出来的结构更加整齐&#xff0…

微软想让你跟机器人说句话就把事办了

也别猜错&#xff0c;微软可没有像 Google 一样打算让四只脚能跑 60 迈和两只脚能穿行森林的机器人大军占领你的家。他们家的机器人不是 Robot&#xff0c;而叫 Bot&#xff0c;可能是 chatbot 的简称&#xff0c;也就是聊天机器人。 具体来说&#xff0c;微软在自然语言处理的…

转:Spring Boot 获取 HttpServletRequest 的方法

转自&#xff1a; Spring Boot 获取 HttpServletRequest 的方法 - 简书本文介绍 Spring Boot 2 获取 HttpServletRequest 的方法。 目录 概述 方法Controller 方法参数属性自动注入手动方法调用借助 Mo...https://www.jianshu.com/p/b7a7d66c4ef2 本文介绍 Spring Boot 2 获取…