面试-前端安全-你了解xss和xsrf/csrf吗

414 阅读3分钟

一、XSS攻击(Cross Site Script)

跨站脚本攻击,原本缩写是CSS,为了和样式表缩写有区别,所以叫XSS。

XSS是指,攻击者在网站上注入恶意代码,通过脚本进行控制或者获取数据

XSS分为3类:反射性(非持久性)、存储型(持久性)、基于DOM

1、类别

  • 反射型(非持久性跨站)

    访问链接,获取用户信息,比如 cookie

    例:在url地址上拼接script脚本代码 www.xx.com/app.html?<script>alert('点击这里去获取用户数据')</script>。 用户在访问该地址的时候,会执行script脚本,用户点击弹窗,攻击者就能进行恶意操作。

  • 存储型(持久性跨站)

    最直接的危害类型,跨站代码存储在服务器(数据库)

    例:在用户form表单提交的数据的时候,注入脚本代码,植入到数据库

  • DOM跨站

    利用脚本,对本地DOM的恶意篡改利用

2、防患

  1. 链接、查询关键字等输出内容,进行encode编码
  2. 用户账号密码进行白名单设置,如:只能输入字母、数字。 对富文本编辑框进行黑名单设置,如:标签输入进行编码,特殊字符禁用或编码
  3. cookie设置http-only,js无法获取cookie,cookie不要存放用户敏感信息。

二、CSRF/XSRF(Cross Site Request Forgery)

跨站请求伪造。通过第三方网站,不能获取cookie,只是冒充用户的cookie请求服务器。

例子

  1. 用户在网站A登录后,数据库返回cookie,并在浏览器保存cookie信息。
  2. 此时弹出来一条广告,用户点击广告,跳转到网站B
  3. 网站B携带了网站A的cookie登录信息,并调用网站A的接口

网站B请求网站A的接口不会跨域吗? 攻击者的网站B虽然是跨域的,但是他请求的接口是网站A,跟网站A是同源的,所以能够携带cookie发起访问

上面例子的第3步是怎么去调用网站A呢? - 加载图片,通过图片src发起GET请求,宽高设置为0 - 超链接地址,引导用户去点击一个a标签,a标签的href就是网站A的接口 - 隐藏表单,自动加载、提交

防患

  1. Referer Check,检查发起请求的链接是否在白名单。
  2. 添加token验证。

三、补充 SameSite

SameSite cookies

SameSite 是HTTP响应头 Set-Cookie 的属性之一。它允许您声明该Cookie是否仅限于第一方或者同一站点上下文。

SameSite 接受下面三个值:

Lax Cookies允许与顶级导航一起发送,并将与第三方网站发起的GET请求一起发送。这是浏览器中的默认值。

Strict Cookies只会在第一方上下文中发送,不会与第三方网站发起的请求一起发送。

None Cookie将在所有上下文中发送,即允许跨域发送。

以前 None 是默认值,但最近的浏览器版本将 Lax 作为默认值,以便对某些类型的跨站请求伪造 CSRF 攻击具有相当强的防御能力。但是会导致内嵌不是同站点的页面无法保持登录状态。比如iframe无法cookie共享。 解决办法

设置sameSite为none,但是必须cookie加上 Secure 属性,secure表示只能在https下才能发送cookie。