前端安全
xss跨站脚本攻击
原理
攻击者往web页面里面插入恶意可执行网页脚本代码,当用户访问网站时时,嵌在web里面的恶意脚本被执行,从而达到获取用户信息或者其他目的的行为
定义
通过存在安全漏洞的web网站注册用户的浏览器内运行非法的html标签或者是js代码进行的一种攻击
类型
存储型xss
特点
持久型xss攻击,恶意代码存储在服务端,来源于后端从数据库中读取出的数据
攻击流程
1.攻击者提交恶意代码到网站的服务器数据库中
2.用户访问网站,服务器将恶意代码取出,拼接到html中,返回给浏览器
3.浏览器解析执行,恶意代码执行
4.攻击者获取用户的信息发送到特定的网站,或者是冒充用户的行为,调用网站的接口,执行特定的操作
常发生的场景
带有用户保存数据的网站功能,如用户发帖,商品评论、用户私信
满足的条件
####### post提交表单,后端没有做转义,直接入库
####### 后端从数据库中读取数据,没有做转义,直接返回给前端
####### 前端拿到数据后,没有做转义,直接渲染成dom
预防措施
对于输入的内容进行过滤转义
对html充分的转义
反射型xss
特点
将恶意代码包装在url的参数中,服务端将恶意代码取出返回给浏览器,浏览器执行
####### 例如https://xxx.com/xxx?default=
非持久性xss,即时性,不经过服务端存储,通过get和post就可以拿到
需要诱骗用户点击,必须要通过用户链接点击才发起
盗取用户敏感反馈信息
攻击流程
1.攻击者将恶意代码包装在url的参数中
2.用户打开这个url,服务端将恶意代码取出,拼接成html返回给浏览器
3.浏览器解析执行,恶意代码也执行
4.攻击者获取用户的信息发送到特定的网站,或者是冒充用户的行为,调用网站的接口,执行特定的操作
常发生的场景
URL 传递参数的功能,如网站搜索、跳转
预防措施
Chrome 和 Safari 能够检测到 url 上的xss攻击,将网页拦截掉,但是其它浏览器不行,如Firefox
1.确保web网站的渲染的所有的内容或者数据都来自于服务端
2.尽量不要从url,dom.forms等dom的api中直接获取数据渲染
3.尽量不要使用eval(),document.write(),innerHtml,document.createElement()等可执行字符串方法
4.对字符串进行编码(encodeURIComponent)
DOM型xss
特点
恶意代码取出和执行都是在浏览器,是前端的一个漏洞
攻击流程
攻击者将恶意代码包装在url中
2.用户打开url
3.浏览器解析执行,前端js将恶意代码取出,执行
4.攻击者获取用户的信息发送到特定的网站,或者是冒充用户的行为,调用网站的接口,执行特定的操作
预防措施
1.是由于前端代码不规范导致的,避免使用innerHtml,outerHtml,使用textContent,setAttributes
2.对输入内容进行转义(DOM 中的内联事件监听器和链接跳转都能把字符串作为代码运行,需要对其内容进行检查)
3.尽量少使用内联事件,如onlick,在跳转时是,要检测其内容,屏蔽掉javascrpt:开头的
其他XSS 防范措施
Content Security Policy(csp)
作用
禁止加载外域代码
禁止外域提交
禁止内联代码执行,比较严格,目前就发现github再用
禁止未授权的代码执行
合理使用上报,及时发现,及时解决
设置
服务端使用http的content-security-policy来指定策略,只允许加载同域下的资源
####### content-security-policy:default-src ‘self’
前端meta标签设置csp
#######
服务端设置与前端设置时一样的效果,只是前端设置不能使用report
输入内容长度控制
输入内容限制
其他安全措施
http-only
后端可以设置?httpOnly (不过这不是 XSS攻击 的解决方案,只能降低受损范围)
禁止js读取某些敏感cookie,就算xss完成注入也无法读取cookie
验证码
防止脚本冒充用户提交等危险操作
csrf跨站请求伪造
原理
攻击者诱导用户打开第三方网站,在第三方网站向攻击的网站发送跨站请求,利用用户已经取得网站的注册凭证,绕过后台的验证,冒充用户向网站执行特定的操作
攻击流程
分支主题
预防措施
1.添加验证码(体验不好)
2.关键操作只接受post请求
3.使用token(主流)
- 服务端给用户生成一个token,加密后传递给用户
- 用户在提交请求时,需要携带这个token
- 服务端验证token是否正确
4.检测referer来源
csp同源策略
5.samesite cookie属性
Samesite=Strict严格模式,表示这个cookie不能作为第三方的cookie,有效防止所有的crsf攻击
samesite=lax,宽松模式,比严格模式宽松一点,特定网站跳转过来时可以使用cookie
点击劫持
定义
是指利用透明的按钮或连接做成陷阱,覆盖在 Web 页面之上。然后诱使用户在不知情的情况下,点击连接访问内容的一种攻击手段
方式
1.利用一个透明的iframe,覆盖在web网页上,诱导用户在网页上操作,实际上在不知情的情况下点击了iframe,触发执行恶意网页的命令
2.利用一张图片覆盖网页,遮挡网页原有的位置含义
防御措施
1.X-FRAME-OPTIONS
有三个值,http字段
1.DENY
表示不允许在frame展示,即使是相同域名的页面下嵌套也不可以
2.?SAMEORIGIN
表示该页面可以在相同的域名页面的frame中展示
3.ALLOW-FORM url
表示页面可以在指定的来源的frame中显示
2.js 判断顶层窗口跳转,可轻易破解,意义不大
方法
function locationTop(){
if (top.location != self.location) {
top.location = self.location; return false;
}
return true;
}
locationTop();
破解
// 破解:
// 顶层窗口中放入代码
var location = document.location;
//或者
var location = "";
SQL注入
直接攻击数据库,实现数据库级别的操作,盗用数据
文件上传漏洞
指用户通过利用windows命名规则,上传了可执行的脚本文件(通常是 php),并通过此脚本文件获得了执行服务器端命令的能力
os注入
针对操作系统的
os 命令注入攻击指通过 web 应用,执行非法的操作系统命令达到攻击的目的
网络层 DDos注入
网络层 DDos
|