XSS
XSS 是什么?
XSS是Cross-Site Scripting的缩写,中文名为跨站脚本攻击。
XSS 攻击
XSS攻击主要是指向网页中注入恶意指令代码,然后用户加载执行来完成攻击。
XSS攻击主要利用:
⭐️XSS攻击的一些特点:
1.通常难以从UI上感知(暗地执行脚本)
2.窃取用户信息(cokkie/token)
3.绘制UI(例如弹窗),诱骗用户点击、填写表单
复制代码
XSS 常见类型
Stored XSS (持久型)
⭐️特点:
- 恶意脚本被存在数据库中
- 用户访问页面后读数据然后被攻击
- 危害最大,对全部用户可见
复制代码
Reflected XSS (反射型)
⭐️特点:
- 不涉及数据库
- 从url上进行攻击
复制代码
DOM-based XSS
通过修改DOM节点完成攻击
⭐️特点:
- 不需要服务器的参与
- 攻击的发起+执行都在浏览器中执行
复制代码
Reflected XSS VS DOM-based XSS
?两者区别在于插入脚本的地方不同
Mutatuin-based XSS
⭐️特点:
- 利用浏览器渲染DOM的特性(特性优化)
- 不同浏览器,会有区别(按浏览器进行攻击)
复制代码
XSS 防御
⭐️XSS的核心防御理念:
!永远不要相信用户
!不要将用户提交内容直接转换为DOM
XSS防御现成工具
前端:
- 主流框架默认防御 XSS
- 手动操作dom,使用google-closure-library
服务端(Node):
- DOMPurify
动态生成DOM如何防御XSS?
- string->DOM
一定要从string中过滤 - 用户上传svg
常见,但是要考虑到svg中内置的script标签,所以要进行过滤 - 自定义跳转链接
如果允许用户自定义跳转链接,一定要过滤,最好不要允许 - 自定义样式
过滤background发送的http请求,最好不要允许用户自定义样式
?XSS到底如何预防:
- 输入过滤
- 预防DOM型攻击
在使用.innerHTML、.outerHTML、document.write()时要使用安全的数据,不要把不安全的数据插入到页面上,尽量使用.textContent、.steAttribut()等 - 前端渲染把代码和数据分隔开
- 拼接HTML时对其进行转义
CSRF
CSRF 是什么?
CSRF是Cross-site request forgery的缩写,中文名为跨站伪造请求。
⭐️特点:
- 在用户不知情的前提下
- 利用用户权限(特指cookie)
- 构造指定HTTP请求,窃取或修改用户敏感信息
复制代码
CSRF demo
CSRF 常见攻击方式
- 构造get请求
主动型:用户点击构造的标签,发出请求,构成一次CSRF攻击
被动型:只要访问页面,发出get请求,构成一次CSRF攻击 - 构造别的请求
攻击者可以利用<form>构造任意的请求,通过type="hidden"
传递各种值
CSRF 防御
-
通过验证HTTP请求来源从而达到限制伪造请求
通常限制请求头部 origin,referer -
token机制—判断请求来自合法来源的方式
在请求地址中添加token并验证
⭐️实现过程:
⭐️!token会和用户绑定:因为攻击者也可以是注册用户,所以用户只能获取自己的token
⭐️!过期时间:向前保密,以防攻击者使用其它用户过期的token进行攻击 -
iframe攻击
如果同源请求,使用响应头部X-Frame-Options:DENY/SAMEORIGIN
(指定页面能否作为iframe) -
GET !== GET + POST
当GET == GET + POST,如有CSRF攻击,就可以一次获取和更新信息,所以要将GET 和POST分开两个接口 -
SameSite Cookie
只有同源请求才能发送cookie
现在主要浏览器默认是Lax模式,相对Strict而言,首次导航可以带cookie
strict模式:
首次导航,就算是同源,也不能带cookie,只有当首次导航结束后,页面再次发送请求,才能携带cookie
⭐️首次导航的限制可以避免敏感操作跳过二次确认
防御CSRF的正确方法:
在一个中间件统一处理CSRF防御
引用参考
最后
本次学习了XSS和CSRF的一些基础知识,以及如何防御XSS和CSRF。当今互联网发展深入我们的生活,也有一些不怀好意的人通过攻击获取隐私的数据内容,所以信息安全也变的十分重要。
如有错误,欢迎指正~!