前端知识库-前端安全系列一(攻防)

简介: 最近重新整理了下自己的前端相关知识,在前端安全这个领域由于最近两年做的事内部项目,对此没有太多的实际应用,借此机会重新去了解下,俗话说温故而知新,从故有的知识中总结获取新的知识才是我们进步的基础。

网络异常,图片无法展示
|

前言


最近重新整理了下自己的前端相关知识,在前端安全这个领域由于最近两年做的事内部项目,对此没有太多的实际应用,借此机会重新去了解下,俗话说温故而知新,从故有的知识中总结获取新的知识才是我们进步的基础。

前端安全


跨站点请求伪造(CSRF)

在国内互联网刚发展阶段,网站的CSRF漏洞还是比较多的。假设我们是攻击者,那当被攻击网站满足以下几个条件是,我们就可以顺利的进行CSRF攻击:

  • 用户登录被攻击网站,并且保存的cookie信息
  • 用户打开另一个tab访问我们的恶意网站
  • 被攻击网站未做任何CSRF防护

攻击流程

当你的网站满足上面三个条件了,那当前登录用户的信息对于恶意网站而言就是完全透明的了,下面说说攻击流程:

网络异常,图片无法展示
|
如图所示:

  • 用户打开A网站
  • 登录A(XSRF漏洞)
  • 生成登录cookie
  • 同个浏览器B(伪造攻击网站)
  • B网站通过脚本获取A的cookie并发送给攻击者后台
  • 攻击者拿到cookie 通过cookie获取用户信息

如何防范

通过分析可以发现XSRF攻击方式是通过钓鱼网站拿到cookie,然后攻击者进行非法操作,解决方式就是让攻击者拿不到cookie或者验证方式不仅仅只是cookie。

  • 尽量使用POST,限制GET,这样可以增加攻击难度,攻击者必须伪造form表单才能请求。
  • 将cookie属性设置为httponly,这样攻击者就获取不到cookie了。
//nodejs express为例
res.cookie('userinfo','*******',{maxAge:60000,path:'/news',httpOnly:true})
  • 服务端增加token验证,每次登录时服务端生成token,每次的请求对token进行校验
  • 通过Referer识别,服务端通过header中的refer获取来源地址,如果是非法的则拒绝操作。
String referer = req.headers.referer 

跨站脚本攻击(XSS)

反射型

  • 用户通过攻击者的提供的链接登录被攻击的A网站
  • A网站对链接未做任何字符串校验

存储型

  • A网站是博客,论坛类的网址,并可以输入内容
  • A网站对输入的内容未做任何字符串校验
  • 用户浏览攻击者发布的内容

DOM型

  • 用户通过攻击者提供的wifi或其他网络打开A网站
  • 用户点击到攻击者插入A网站的DOM

攻击流程

网络异常,图片无法展示
|
如图所示,攻击的流程略有不同: 反射型

  • 攻击者伪造A网站链接
  • 用户打开A网站
  • 插入攻击者的攻击js
  • 获取用户信息进行不法操作

存储型

  • 攻击者A网站输入攻击脚本代码或sql语句存入数据库(如博客 论坛网站)
  • 用户打开A网站
  • 用户浏览到攻击者的页面
  • 获取用户信息进行不法操作 DOM型(可以说是基于存储型的)
  • 攻击者提供的数据源(cdn劫持,数据库存储的非法字符)
  • 数据通过一个不可信赖的数据源进入 Web 应用程序
  • 用户浏览加载不可信赖的数据源攻击脚本
  • 获取用户信息进行不法操作

如何防范

通用防御手段:

  • 在输出html时,加上Content Security Policy的Http Header (作用:可以防止页面被XSS攻击时,嵌入第三方的脚本文件等) (缺陷:IE或低版本的浏览器可能不支持)
  • 在设置Cookie时,加上HttpOnly参数 (作用:可以防止页面被XSS攻击时,Cookie信息被盗取,可兼容至IE6) (缺陷:网站本身的JS代码也无法操作Cookie,而且作用有限,只能保证Cookie的安全)
  • 在开发API时,检验请求的Referer参数 (作用:可以在一定程度上防止CSRF攻击) (缺陷:IE或低版本的浏览器中,Referer参数可以被伪造)

反射型:

后台渲染html时候需要以下函数过滤:

  • htmlspecialchars函数(php)
  • htmlentities函数
  • HTMLPurifier.auto.php插件(php)
  • RemoveXss函数

前端通过后台api渲染页面时候:

  • 尽量使用innerText(IE)和textContent(Firefox),也就是jQuery的text()来输出文本内容
  • 必须要用innerHTML等等函数,则需要做类似php的htmlspecialchars的过滤

持久型:

  • 服务端处理存储的数据,将可能执行的脚本字符转成字符串,如下:
function htmlspecialchars(str){           \
          str = str.replace(/&/g, '&');  \
          str = str.replace(/</g, '&lt;');  \
          str = str.replace(/>/g, '&gt;');  \
          str = str.replace(/"/g, '&quot;');  \
          str = str.replace(/'/g, '&#039;');  \
          return str;  \
}

DOM型: DOM型XSS主要是由客户端的脚本通过DOM动态地输出数据到页面而不是依赖于将数据提交给服务器端,而从客户端获得DOM中的数据在本地执行,因而仅从服务器端是无法防御的。其防御在于:

  • 避免客户端文档重写、重定向或其他敏感操作,同时避免使用客户端数据,这些操作尽量在服务器端使用动态页面来实现;
  • 分析和强化客户端JS代码,特别是受到用户影响的DOM对象,注意能直接修改DOM和创建HTML文件的相关函数或方法,并在输出变量到页面时先进行编码转义,如输出到HTML则进行HTML编码、输出到

点击劫持

是什么

一些恶意网站使用iframe把一些网站嵌入自己的网站中,然后把 iframe 设置透明,用定位的手段的把一些引诱用户在恶意网页上点击。这样用户不知不觉中就进行了某些不安全的操作。

攻击流程

  • 攻击者伪造使用iframe伪造网站
  • 用户在伪造的网站上进行不安全的操作
  • 攻击者通过不安全操作获取想要的信息

如何防范

  • js防范:判断上层路由地址是否和原网站的地址保持一致
if (top.location.hostname !== self.location.hostname) {
    alert("非法访问!");
    top.location.href = self.location.href;
}
  • 通过header配置防止:
//nginx 
add_header X-Frame-Options SAMEORIGIN;
//nodejs
res.setHeader('X-Frame-Options','DENY');

总结


互联网发展迅速,前端开发的需求量也与日俱增。如何开发一个安全易用的应用是我们每个前端开发者必修的课题,因此掌握常见的网站攻击手段,是我们防御攻击的最有效方法之一。在前端安全的问题上,没有任何一名开发者能保证自己开发的应用毫无漏洞,我们能做的就是杜绝已知的漏洞,了解可能会有的漏洞,路漫漫其修远兮,各位一起努力营造一个安全健康的互联网环境吧。

相关文章
|
7天前
|
缓存 安全 JavaScript
前端安全:Vue应用中防范XSS和CSRF攻击
【4月更文挑战第23天】本文探讨了在Vue应用中防范XSS和CSRF攻击的重要性。XSS攻击通过注入恶意脚本威胁用户数据,而CSRF则利用用户身份发起非授权请求。防范措施包括:对输入内容转义、使用CSP、选择安全的库;采用Anti-CSRF令牌、同源策略和POST请求对抗CSRF;并实施代码审查、更新依赖及教育团队成员。通过这些实践,可提升Vue应用的安全性,抵御潜在攻击。
|
3月前
|
缓存 前端开发 安全
前端反向代理的神奇世界:加速、安全与缓存的秘密(下)
前端反向代理的神奇世界:加速、安全与缓存的秘密(下)
|
3月前
|
缓存 负载均衡 前端开发
前端反向代理的神奇世界:加速、安全与缓存的秘密(上)
前端反向代理的神奇世界:加速、安全与缓存的秘密(上)
前端反向代理的神奇世界:加速、安全与缓存的秘密(上)
|
4月前
|
存储 监控 前端开发
前端知识笔记(五)———前端密钥怎么存储,才最安全?
前端知识笔记(五)———前端密钥怎么存储,才最安全?
299 0
|
8月前
|
安全 前端开发
前端学习笔记202306学习笔记第四十八天-https为什么安全1
前端学习笔记202306学习笔记第四十八天-https为什么安全1
33 0
|
8月前
|
安全 前端开发
前端学习笔记202306学习笔记第四十八天-https为什么安全2
前端学习笔记202306学习笔记第四十八天-https为什么安全2
38 0
|
8月前
|
安全 前端开发
前端学习笔记202306学习笔记第四十八天-https为什么安全4
前端学习笔记202306学习笔记第四十八天-https为什么安全4
37 0
|
8月前
|
安全 前端开发
前端学习笔记202306学习笔记第四十八天-https为什么安全5
前端学习笔记202306学习笔记第四十八天-https为什么安全5
30 0
|
8月前
|
安全 前端开发
前端学习笔记202306学习笔记第四十八天-https为什么安全3
前端学习笔记202306学习笔记第四十八天-https为什么安全3
48 0
|
9月前
|
JavaScript 前端开发 安全
前端安全-JS原型链污染是怎么回事
面试题经常会提到一个问题,就是前端安全问题哪些
91 0