XSS、CSRF攻击

1.跨站脚本攻击 XSS

通过注入恶意脚本篡改网站,反射型的 XSS 需要用户点击链接行为,存储型的 XSS 是脚本已经成功写入到了网站代码,危害较大,还有蠕虫类型,如果有XSS漏洞,通过社交网络消息传播。

预防方案

  1. 使用带有 httponly 属性的cookie

    httponly 属性最早有微软提出,具有 httponly 属性 cookie 无法被 js 获取。

  2. 输入检查

    前后端在输入点过滤掉特殊字符,把敏感的\、JavaScript等字符过滤掉。
    尽量减少拼接字符的形式传参。
    url进行URLEncode

  3. 输出检查

    对输出内容进行转义,利用统一的编码方式。如果是字符串,用双引号包住变量强制转换为字符串。

  4. 处理富文本

    如果有富文本输出需要允许插入一段html代码,需要建立标签白名单限制输出。

如果利用了 XSS 漏洞进行 CSRF 攻击,也叫 XSRF。

2.跨站伪造请求 CSRF

利用用户登录态,在已知站点某些请求漏洞下,制造用户“不知情”的请求,达到非法操作的目的。

也是利用了用户cookie,但不一定要自己获得用户cookie。

常隐藏在 img 标签,利用 src 发送 get 请求。或者构建一个表单然后隐藏起来发送请求。

目前部分浏览器会禁止在 img、iframe等标签携带 Cookie 发送请求。如果响应的 HTTP 头中有 P3P 头,将会允许带上cookie请求。

以前Flash也可以带上本地 cookie 发送网络请求,但是后来被禁止。

预防方案

  1. 验证码

    对每个输入的地方强制用户交互,保证用户知情。

  2. Referer check

    对请求的 Referer 进行检查,限定网络请求必须在某个合法页面。

    但是服务器并不是什么时候都能取到 Refer , 比如从 https 跳转到 http,浏览器不会发送 Referer

  3. Anti CSRF token

    1. 对参数加盐后哈希,让攻击者不知道 salt 的情况下无法构造出URL。但对用户来说不是很友好
    2. 对每个数据输入点生成一个随机token,提交时同时带上token,token验证正确后则为合法请求,然后销毁token。最好不要放在url上,因为可能被攻击者从请求记录中截取到,应该放在一个 hidden imput中。