一、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、防患
- 链接、查询关键字等输出内容,进行
encode编码。 - 用户账号密码进行
白名单设置,如:只能输入字母、数字。 对富文本编辑框进行黑名单设置,如:标签输入进行编码,特殊字符禁用或编码 - cookie设置
http-only,js无法获取cookie,cookie不要存放用户敏感信息。
二、CSRF/XSRF(Cross Site Request Forgery)
跨站请求伪造。通过第三方网站,不能获取cookie,只是冒充用户的cookie请求服务器。
例子:
- 用户在
网站A登录后,数据库返回cookie,并在浏览器保存cookie信息。 - 此时弹出来一条广告,用户点击广告,跳转到
网站B。 - 网站B携带了网站A的
cookie登录信息,并调用网站A的接口
网站B请求网站A的接口不会跨域吗? 攻击者的网站B虽然是跨域的,但是他请求的接口是网站A,跟网站A是同源的,所以能够携带cookie发起访问
上面例子的第3步是怎么去调用网站A呢? - 加载图片,通过图片src发起GET请求,宽高设置为0 - 超链接地址,引导用户去点击一个
a标签,a标签的href就是网站A的接口 - 隐藏表单,自动加载、提交
防患
- Referer Check,检查发起请求的链接是否在白名单。
- 添加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。