浅析XSS与CSRF

在 Web 安全方面,XSS 与 CSRF 可以说是老生常谈了。

XSS


XSS,即 cross site script,跨站脚本攻击,缩写原本为 CSS,但为了和层叠样式表(Cascading Style Sheet)区分,改为 XSS。

XSS 攻击是指攻击者在网站上注入恶意脚本,使用户在浏览使用网页时进行恶意操作,注入脚本除了 JavaScript,还会有 CSS、HTML 等等。

XSS 攻击可以分为 3 种:反射型(非持久型)、存储型(持久型)、DOM型。

反射型


反射型的 XSS 攻击方式一般是攻击者诱使用户进行点击恶意链接、提交表单等等操作,从而达到注入脚本的目的。

举个例子,假设某页面会直接把搜索关键词拼接到 HTML 页面上显示出来:

<p>您搜索的关键词是:<?php showKeyword(keyword) ?></p>

当用户点击搜索后,会向服务端发送这样的请求http://example/search?keyword=xxx,然后服务端把 keyword 后面的字符进行 HTML 拼接然后返回。

这时,假如用户点击了一个恶意链接http://example/search?keyword=<script>xss攻击脚本</script>,那返回的 HTML 就会变成这样:

<p>您搜索的关键词是:<script>xss攻击脚本</script></p>

然后浏览器就会执行 script 里面 xss 攻击脚本,从而达到攻击者的攻击目的。

存储型


存储型的 XSS 攻击一般是攻击者将恶意代码作为输入的数据提交给服务端,然后服务端存储到数据库内,当有用户请求这个数据后,服务端返回的数据其实是恶意代码,从而发生 XSS 攻击。

比较常见的就是在论坛发帖、评论,然后在里面注入恶意代码,当用户点击帖子的时候,就会受到攻击。

DOM型


DOM型的 XSS 攻击一般是攻击者在注入恶意脚本后,修改页面元素,获取 DOM 的数据然后执行攻击操作。比如将用户的登录表单的提交换成攻击者的服务端,从而获取用户的登录信息。

防范 XSS


  1. CSP 内容安全策略,主流浏览器都实现了 CSP。

    配置内容安全策略涉及到添加 Content-Security-Policy HTTP头部到一个页面,并配置相应的值,以控制用户代理(浏览器等)可以为该页面获取哪些资源。比如一个可以上传文件和显示图片页面,应该允许图片来自任何地方,但限制表单的action属性只可以赋值为指定的端点。一个经过恰当设计的内容安全策略应该可以有效的保护页面免受跨站脚本攻击。 (MDN)

  2. 通过设置 HttpOnly 防止 Cookie 被读取。

  3. 前端对用户的输入进行检查转义,建立白名单,只允许安全的字符和 HTML 标签存在:

    const HTML_DECODE = {
    ' ': '\n',
    '&lt;' : '<',
    '&gt;' : '>',
    '&amp;' : '&',
    '&quot;': '"',
    '&nbsp;': ' ',
    '&quot;': '\'
    // more code
    };
  4. 前端逻辑比较容易被绕过,所以后端也要对接收的数据进行检查过滤,并在输出或者拼接 HTML 的时候进行编码、转义。

CSRF


CSRF,即 cross site request forgery,跨站请求伪造,可以理解为重放攻击。比较常见的情况是,攻击者诱使用户打开钓鱼网站进行一些操作。

还是举一个例子来说明:假设某用户登录了www.a.com网站,然后在没有登出的情况下打开了钓鱼网站www.b.com,而钓鱼网站里面有恶意脚本,在被打开的时候就带着 Cookie 信息向www.a.com发送了跨域请求。

CSRF 的特点


  1. CSRF 发起请求方式很多:图片URL、超链接、表单提交等。
  2. 与 XSS 攻击不同, CSRF 一般在第三方网站发起攻击。
  3. CSRF 只是利用 http 请求自动携带用户的 Cookie 信息来通过验证,并不能获取 Cookie 信息。

CSRF 防范


对于重放攻击,其实前端是没什么办法进行处理的,主要靠后端。

  1. Referer 字段

    在 http 的请求头里,有一个 Referer 字段,记录了 http 请求的来源地址,服务端通过检查这个字段,判断请求是否来自合法地址。但需要注意的是,Referer 字段是由浏览器来进行添加的,所以存在被篡改的可能。

  2. 验证机制

    通常 CSRF 是在用户不知情的情况下发送请求进行攻击的,所以可以利用验证机制强制用户与网站进行交互,例如发送验证码到用户的手机、邮箱,或者需要用户拼图、填写验证码等。但验证机制对于用户体验不太好,而且并不是所有操作都能加上验证的。

  3. token

    服务端在用户登录后,签发一个随机的 token,可以埋在页面中,也可以存储在 sessionStorage 中,然后在客户端设置拦截器,为所有请求加上 token,服务端再设置拦截器,检查请求是否拥有 token。因为同源策略(协议、域名、端口相同为同源)的原因,CSRF 并不能拿到 token。

    let xhr = new XMLHttpRequest();
    let token = sessionStorage.getItem('csrfToken');
    xhr.setRequestHeader('CSRF-Token', token);

    但需要注意的是, token 需要存储在服务端,需要服务端进行读取、验证 token。

浅析XSS与CSRF的更多相关文章

  1. 漏洞科普:对于XSS和CSRF你究竟了解多少

    转自:http://www.freebuf.com/articles/web/39234.html 随着Web2.0.社交网络.微博等等一系列新型的互联网产品的诞生,基于Web环境的互联网应用越来越广 ...

  2. XSS 和 CSRF 攻击

    web安全中有很多种攻击手段,除了SQL注入外,比较常见的还有 XSS 和 CSRF等 一.XSS(Cross Site Scripting)跨站脚本 XSS其实就是Html的注入问题,攻击者的输入没 ...

  3. XSS与CSRF两种跨站攻击比较

    XSS:跨站脚本(Cross-site scripting) CSRF:跨站请求伪造(Cross-site request forgery) 在那个年代,大家一般用拼接字符串的方式来构造动态SQL 语 ...

  4. 【实习记】2014-08-23网络安全XSS与CSRF总结

        XSS:脚本中的不速之客XSS:跨站脚本(Cross-site scripting)CSRF:冒充用户之手CSRF:跨站请求伪造(Cross-site request forgery) 谷歌搜 ...

  5. 总结 XSS 与 CSRF 两种跨站攻击

    前言 在那个年代,大家一般用拼接字符串的方式来构造动态 SQL 语句创建应用,于是 SQL 注入成了很流行的攻击方式.在这个年代, 参数化查询 [1] 已经成了普遍用法,我们已经离 SQL 注入很远了 ...

  6. 浅谈CDN、SEO、XSS、CSRF

    CDN 什么是CDN 初学Web开发的时候,多多少少都会听过这个名词->CDN. CDN在我没接触之前,它给我的印象是用来优化网络请求的,我第一次用到CDN的时候是在找JS文件时.当时找不到相对 ...

  7. XSS和CSRF的理解

    声明:转自 http://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html XSS攻击:跨站脚本攻击(Cross Site Scripting ...

  8. 总结XSS与CSRF两种跨站攻击

    XSS:跨站脚本(Cross-site scripting),实际应是"CSS",但由于和层叠样式表CSS名称冲突,故改为"XSS" CSRF:跨站请求伪造(C ...

  9. 014_浅说 XSS和CSRF

    在 Web 安全领域中,XSS 和 CSRF 是最常见的攻击方式.本文将会简单介绍 XSS 和 CSRF 的攻防问题. 声明:本文的示例仅用于演示相关的攻击原理 XSS XSS,即 Cross Sit ...

随机推荐

  1. win/mac平台搭建ionic开发环境教程(转)

    出处:http://www.ionic-china.com/doc/ionic-winmac.html#preface 前言 ionic中文网为大家准备了绿色版的nodejs和androidSDK以及 ...

  2. i2c_client的生成

    网上很多文档都是介绍源码,包括i2c_client结构体的源码都有贴出,看上去似乎需要手动写该结构体,但实际上,i2c_client的生成是用如下方法. \arch\arm\mach-omap2/bo ...

  3. VIP之Scaler

    VIP Scaller II   从以前的时序来看   当把2160p分辨率经过Scaller之后,变换为1080p输出的数据再经过CVO处理之后,输出的帧结构不正常,有效数据组成一个行,无效数据也是 ...

  4. 20155205《Java程序设计》实验五(网络编程与安全)实验报告

    20155205 <Java程序设计>实验五(网络编程与安全)实验报告 一.实验内容及步骤 (一) 两人一组结对编程 参考http://www.cnblogs.com/rocedu/p/6 ...

  5. 《深入浅出MFC》系列之运行时类型识别(RTTI)

    /********************************************************************************** 发布日期:2017-11-13  ...

  6. Magic Powder - 2 (CF 670_D)

    http://codeforces.com/problemset/problem/670/D2 The term of this problem is the same as the previous ...

  7. spring的bean在什么时候被实例化

    Spring什么时候实例化bean,首先要分2种情况   第一:如果你使用BeanFactory作为Spring Bean的工厂类,则所有的bean都是在第一次使用该Bean的时候实例化   第二:如 ...

  8. Northwind测试学习用数据库

    下载地址: https://northwinddatabase.codeplex.com/

  9. 18、标准IO库详解及实例

    标准IO库是由Dennis Ritchie于1975年左右编写的,它是Mike Lestbain写的可移植IO库的主要修改版本,2010年以后, 标准IO库几乎没有进行什么修改.标准IO库处理了很多细 ...

  10. spark 中划分stage的思路

    窄依赖指父RDD的每一个分区最多被一个子RDD的分区所用,表现为 一个父RDD的分区对应于一个子RDD的分区 两个父RDD的分区对应于一个子RDD 的分区. 宽依赖指子RDD的每个分区都要依赖于父RD ...