XSS和CSRF小笔记

184 阅读2分钟

XSS

定义

跨网站指令码(Cross-site scripting),通常称之为XSS,是一种网站应用程式的安全漏洞攻击,是代码注入的一种。它允许恶意使用者将程式码注入到网页上,其他使用者在观看网页时就会受到影响。
XSS分为三种类型:反射型,存储型和DOM-based

如何实现攻击?

  • XSS通过修改HTML节点或者执行JS代码来攻击网站
  • 例如通过URL来获取某些参数
<!-- http://www.domain.com?name=<script>alert(1)</script> -->
<div>{{name}}</div>

上述URL输入可以将HTML改为<div><script>alter(1)</script></div>,这样页面中就凭空多了一行可执行脚本。这种攻击类型是反射型攻击,也就是DOM-based攻击

如何防御?

最普遍的做法就是转义输入输出的内容,对引号尖括号斜杠进行转译

    function escape(str){
        str = str.replace(/&/g,"&amp;");
        str = str.replace(/</g, "&lt;");
        str = str.replace(/>/g, "&gt;");
        str = str.replace(/"/g, "&quto;");
        str = str.replace(/'/g, "&##39;");
        str = str.replace(/`/g, "&##96;");
        str = str.replace(/\//g, "&##x2F;");
        return str;
    }

通过转义可以将攻击代码<script>alert(1)</script>变成

escape('<script>alert(1)</script>') //=>&lt;script&gt;alert(1)&lt;&##x2F;script&gt;

对于显示富文本而言,不能通过转义来转义所有字符,因为这样会把需要的格式也过滤掉。此时通常采用白名单过滤的方法,白名单相比黑名单实现的过程更简单一些:

    var xss = require("xss");
    var html = xss('<h1 id='title'>XSS Demo</h1><script>alert("xss");</script>')
    //=> <h1>XSS Demo</h1>&lt;script&gt;alert("xss");&lt;/script&gt;

可以实现保留h1标签的同时过滤掉<script>标签

CSRF

定义

跨站请求伪造(Cross-site request forgery),也被称为one-click attack或者session riding,通常缩写为CSRF或者XSRF。是一种挟持用户已经登陆的身份然后执行非用户本意的操作的攻击方法。

CSRF就是利用用户的登录状态发起恶意请求

如何实现CSRF攻击?

假设网站中有一个通过get请求提交用户评论的接口,那么攻击者就可以在钓鱼网站中加入一个图片,图片的地址就是评论接口 <img src="http://www.domain.com/xxx?comment='attack'"/>

如何防御?

  • 要求GET请求是幂等的,也就是请求多少次都不会对请求资源产生修改操作
  • 不让第三方网站访问到cookie
  • 阻止第三方网站的请求接口
  • 请求时附带验证信息,比如验证码token(这样就没法直接利用接口发送攻击了,使用接口前要求查看token或验证码)