XSS防御过程

XSS成因

是通过利用网页开发时留下的漏洞,通过注入恶意指令代码,使用户加载并执行攻击者恶意制造的网页程序

XSS防御过程:

  • 编码:通过编码解码保护代码
  • 过滤:过滤会破坏我们功能的内容,比如过滤掉用户输入的点击事件,或者iframe(嵌入广告页面) style(可能被用到!important) stript 等节点
  • 校正:被破坏,但没有功能影响 只是DOM错乱之类;

通过构建Node服务和建立一个评论功能,实现XSS的攻击和预防,因为通过评论功能是极其容易被攻击,步骤如下

  • 构造接口

    • 一个编码评论的接口 /comment
    • 一个获取评论的接口 /getComment

      1
      2
      3
      4
      5
      6
      7
      8
      9
      router.get('/comment', function (req, res, next) {
      comments.v = html_encode(req.query.comment);
      })
      router.get('/getComment', function (req, res, next) {
      res.json({
      comment: comments.v
      })
      })
  • 交互部分,在页面上添加脚本请求接口

    • 页面上添加文本框和按钮

      1
      2
      3
      4
      5
      6
      <textarea name="name" rows="8" cols="80" id="text">
      <p>sks<img src="null" alt="" onerror="alert(1)"></p>
      </textarea>
      <button type="button" name="button" id="btn">评论</button>
      <button type="button" name="button" id="get">获取评论</button>
    • 添加执行脚本

      • 通过获取页面元素,并对他们添加监听事件
      • 定义一个XMLHttpRequest对象进行前后端数据传输
      • open函数参数需要请求方法,请求URL
      • 最后发送请求使用send方法
      • 关于编码与解码,我们可以利用第三方库,这部分编码较为复杂

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        25
        26
        27
        28
        29
        30
        31
        32
        33
        34
        35
        36
        37
        38
        39
        //获取元素
        var btn = document.getElementById('btn');
        var get = document.getElementById('get');
        var txt = document.getElementById('text');
        //监听评论按钮事件
        btn.addEventListener('click', function () {
        var xhr = new XMLHttpRequest();
        var url = '/comment?comment=' + txt.value;
        xhr.open('GET', url, true);
        xhr.onreadystatechange = function () {
        if (xhr.readyState == 4) {
        if (xhr.status == 200) {
        console.log(xhr);
        } else {
        console.log('error');
        }
        }
        }
        xhr.send();
        });
        //监听获取评论按钮事件
        get.addEventListener('click', function () {
        var xhr = new XMLHttpRequest();
        var url = '/getComment';
        xhr.open('GET', url, true);
        xhr.onreadystatechange = function () {
        if (xhr.readyState == 4) {
        if (xhr.status == 200) {
        var com = parse(JSON.parse(xhr.response).comment);
        var txt = document.createElement('span');
        txt.innerHTML = com;
        document.body.appendChild(txt);
        } else {
        console.log('error');
        }
        }
        }
        xhr.send();
        });

利用XSS攻击案例

获取cookie

XSS 攻击的原理是,攻击者插入一段可执行的 JavaScripts 脚本,该脚本会读出用户浏览器的 cookies 并将它传输给攻击者,攻击者得到用户的 Cookies 后,即可冒充用户。但是要防范 XSS 也很简单,在写入 cookies 时,将 HttpOnly 设置为 true,客户端 JavaScripts 就无法读取该 cookies 的值,就可以有效防范 XSS 攻击。因为 tokens 也是储存在本地的 session storage 或者是客户端的 cookies 中,也是会受到 XSS 攻击。所以在使用 tokens 的时候,必须要考虑过期机制,不然攻击者就可以永久持有受害用户帐号。

Github

参考

关于 Token,你应该知道的十件事