【Safety】简介

article/2025/9/20 4:07:09

XSS


涉及面试题:什么是 XSS 攻击?如何防范 XSS 攻击?什么是 CSP?

XSS是什么

XSS 简单点来说,就是攻击者想尽一切办法将可执行的代码注入到网页中

XSS分类边界

XSS 可以分为多种类型,但是总体上认为分为两类

  • 持久型
  • 非持久型

持久型XSS是什么

持久型也就是攻击的代码被服务端写入进数据库中,这种攻击危害性很大,因为如果网站访问量很大的话,就会导致大量正常访问页面的用户都受到攻击。

EX1

对于评论功能来说,就得防范持久型 XSS 攻击,因为我可以在评论中输入以下内容

在这里插入图片描述

这种情况如果前后端没有做好防御的话,这段评论就会被存储到数据库中,这样每个打开该页面的用户都会被攻击到。

EX2

  • 在新浪博客写一篇文章,同时偷偷插入一段<script>
  • 攻击代码中,获取cookie,发送到自己的服务器
  • 发布博客,有人查看博客内容
  • 会把查看者的cookie发送到攻击者的服务器

非持久型XSS是什么

非持久型相比于前者危害就小的多了,一般通过修改 URL 参数的方式加入攻击代码,诱导用户访问链接从而进行攻击。

举个例子,如果页面需要从 URL 中获取某些参数作为内容的话,不经过过滤就会导致攻击代码被执行

<!-- http://www.domain.com?name=<script>alert(1)</script> -->
<div>{{name}}</div>                                                  

非持久型XSS条件

但是对于这种攻击方式来说,如果用户使用 Chrome 这类浏览器的话,浏览器就能自动帮助用户防御攻击。但是我们不能因此就不防御此类攻击了,因为我不能确保用户都使用了该类浏览器。

在这里插入图片描述

XSS组合

对于 XSS 攻击来说,通常有两种方式可以用来防御。

转义字符

转义字符是什么

首先,对于用户的输入应该是永远不信任的。最普遍的做法就是转义输入输出的内容,对于引号、尖括号、斜杠进行转义

function escape(str) {str = str.replace(/&/g, '&amp;')str = str.replace(/</g, '&lt;')str = str.replace(/>/g, '&gt;')str = str.replace(/"/g, '&quto;')str = str.replace(/'/g, '&#39;')str = str.replace(/`/g, '&#96;')str = str.replace(/\//g, '&#x2F;')return str
}

通过转义可以将攻击代码 <script>alert(1)</script> 变成

// -> &lt;script&gt;alert(1)&lt;&#x2F;script&gt;
escape('<script>alert(1)</script>')

转义字符条件

但是对于显示富文本来说,显然不能通过上面的办法来转义所有字符,因为这样会把需要的格式也过滤掉。对于这种情况,通常采用白名单过滤的办法,当然也可以通过黑名单过滤,但是考虑到需要过滤的标签和标签属性实在太多,更加推荐使用白名单的方式。

const xss = require('xss')
let html = xss('<h1 id="title">XSS Demo</h1><script>alert("xss");</script>')
// -> <h1>XSS Demo</h1>&lt;script&gt;alert("xss");&lt;/script&gt;
console.log(html)

以上示例使用了 js-xss 来实现,可以看到在输出中保留了 h1 标签且过滤了 script 标签。

CSP

CSP是什么

CSP 本质上就是建立白名单,开发者明确告诉浏览器哪些外部资源可以加载和执行。我们只需要配置规则,如何拦截是由浏览器自己实现的。我们可以通过这种方式来尽量减少 XSS 攻击。

CSP组合

通常可以通过两种方式来开启 CSP:

开启CSP分类边界

  1. 设置 HTTP Header 中的 Content-Security-Policy
  2. 设置 meta 标签的方式 <meta http-equiv="Content-Security-Policy">

HTTP Header分类边界

这里以设置 HTTP Header 来举例

  • 只允许加载本站资源
Content-Security-Policy: default-src ‘self’
  • 只允许加载 HTTPS 协议图片
Content-Security-Policy: img-src https://*
  • 允许加载任何来源框架
Content-Security-Policy: child-src 'none'

当然可以设置的属性远不止这些,你可以通过查阅 文档 的方式来学习,这里就不过多赘述其他的属性了。

Tips

对于这种方式来说,只要开发者配置了正确的规则,那么即使网站存在漏洞,攻击者也不能执行它的攻击代码,并且 CSP 的兼容性也不错。

在这里插入图片描述

CSRF


涉及面试题:什么是 CSRF 攻击?如何防范 CSRF 攻击?

CSRF是什么

CSRF 中文名为跨站请求伪造。原理就是攻击者构造出一个后端请求地址,诱导用户点击或者通过某些途径自动发起请求。如果用户是在登录状态下的话,后端就以为是用户在操作,从而进行相应的逻辑。

EX1

假设网站中有一个通过 GET 请求提交用户评论的接口,那么攻击者就可以在钓鱼网站中加入一个图片,图片的地址就是评论接口

<img src="http://www.domain.com/xxx?comment='attack'"/>

那么你是否会想到使用 POST 方式提交请求是不是就没有这个问题了呢?其实并不是,使用这种方式也不是百分百安全的,攻击者同样可以诱导用户进入某个页面,在页面中通过表单提交 POST 请求。

EX2

  • 你已登录一个购物网站,正在浏览器商品
  • 该网站付费接口是 xxx.com/pay?id=100 ,但是没有任何验证
  • 然后你收到一封邮件,隐藏着<img src=xxx>
  • 你查看邮件的时候,就已经悄悄的付费购买了

CSRF组合

如何防御

防范 CSRF 攻击可以遵循以下几种规则:

  1. Get 请求不对数据进行修改
  2. 不让第三方网站访问到用户 Cookie
  3. 阻止第三方网站请求接口
  4. 请求时附带验证信息,比如验证码或者Token

SameSite

可以对 Cookie 设置 SameSite 属性。该属性表示 Cookie 不随着跨域请求发送,可以很大程度减少 CSRF 的攻击,但是该属性目前并不是所有浏览器都兼容。

验证 Referer

对于需要防范 CSRF 的请求,我们可以通过验证 Referer 来判断该请求是否为第三方网站发起的。

Token

服务器下发一个随机 Token,每次发起请求时将 Token 携带上,服务器验证 Token 是否有效。

点击劫持


涉及面试题:什么是点击劫持?如何防范点击劫持?

是什么

点击劫持是一种视觉欺骗的攻击手段。攻击者将需要攻击的网站通过 iframe 嵌套的方式嵌入自己的网页中,并将 iframe 设置为透明,在页面中透出一个按钮诱导用户点击。

在这里插入图片描述

对于这种攻击方式,推荐防御的方法有两种。

X-FRAME-OPTIONS

X-FRAME-OPTIONS 是一个 HTTP 响应头,在现代浏览器有一个很好的支持。这个 HTTP 响应头就是为了防御用 iframe 嵌套的点击劫持攻击。

该响应头有三个值可选,分别是

  • DENY,表示页面不允许通过 iframe 的方式展示
  • SAMEORIGIN,表示页面可以在相同域名下通过 iframe 的方式展示
  • ALLOW-FROM,表示页面可以在指定来源的 iframe 中展示

JS 防御

对于某些远古浏览器来说,并不能支持上面的这种方式,那我们只有通过 JS 的方式来防御点击劫持了。

<head><style id="click-jack">html {display: none !important;}</style>
</head>
<body><script>if (self == top) {var style = document.getElementById('click-jack')document.body.removeChild(style)} else {top.location = self.location}</script>
</body>

以上代码的作用就是当通过 iframe 的方式加载页面时,攻击者的网页直接不显示所有内容了。

中间人攻击


涉及面试题:什么是中间人攻击?如何防范中间人攻击?

中间人攻击是什么

中间人攻击是攻击方同时与服务端和客户端建立起了连接,并让对方认为连接是安全的,但是实际上整个通信过程都被攻击者控制了。攻击者不仅能获得双方的通信信息,还能修改通信信息。

通常来说不建议使用公共的 Wi-Fi,因为很可能就会发生中间人攻击的情况。如果你在通信的过程中涉及到了某些敏感信息,就完全暴露给攻击方了。

中间人攻击条件

当然防御中间人攻击其实并不难,只需要增加一个安全通道来传输信息。HTTPS 就可以用来防御中间人攻击,但是并不是说使用了 HTTPS 就可以高枕无忧了,因为如果你没有完全关闭 HTTP 访问的话,攻击方可以通过某些方式将 HTTPS 降级为 HTTP 从而实现中间人攻击。

小结


在这一章中,我们学习到了一些常见的前端安全方面的知识及如何防御这些攻击。但是安全的领域相当大,这些内容只是沧海一粟,如果大家对于安全有兴趣的话,可以阅读 这个仓库的内容 来学习和实践这方面的知识。


http://chatgpt.dhexx.cn/article/NH6VgvcX.shtml

相关文章

Electron Security Warning (Insecure Content-Security-Policy) 告警解决

Electron Security Warning (Insecure Content-Security-Policy) 告警解决 Electron的Console控制台出现如下告警时&#xff1a; 是安全策略的设置告警&#xff0c;意思是内容安全策略没有设置&#xff0c;或者使用了unsafe-eval的安全设置。如果想要不出现上述告警&#xff…

AppScan,web安全测试

操作手册 登录到站点 扫描过程中有提示登录的&#xff0c;就手动登录 待自动扫描结束后&#xff0c;再手动探索&#xff0c;在被测web页面上手动探索结束后点击确定记录你手动提交的请求&#xff0c;然后【继续仅测试】&#xff0c;等待测试结束 结果分析、生成报告 问题默认是…

SafetyNet使用机器学习策略的真实世界自动驾驶车辆的安全规划(一)

本文主要是SafetyNet的框架概述。 1. 前言 文中提到了传统的决策规划的方法&#xff0c;主要有基于规则的方法和基于学习的方法。该论文提出了一种新的方法&#xff08;文章自己说是新的&#xff0c;最主要的原因是该方法在洛杉矶进行了道路测试。&#xff09; 但是这里的Fal…

【译】Using the SafetyNet API (使用SafetyNet API)

该SafetyNet Attestation API是谷歌播放服务的API&#xff0c;任何开发人员都能以获得一定程度的保证&#xff0c;使用他们的应用程序正在运行的设备是“CTS兼容。” CTS代表兼容性测试套件&#xff0c;这是测试套件设备必须在发布前通过&#xff0c;才能包含Google Play服务。…

GooglePlay提审警告(com.google.android.gms:play-services-safetynet:17.0.0)

1.Goole在今年6月份出的新政策&#xff0c;不在使用safetynet&#xff0c;而使用Play Integrity API。 2.项目本身没有使用过safetynet。 3.使用了firebase。查阅资料&#xff0c;解决方案如下&#xff1a; implementation platform(com.google.firebase:firebase-bom:30.2.…

SafetyNet 漏洞rootutils 利用

1、https://developers.google.com/android/guides/setup 添加SatetyNet 服务 2、https://developers.google.cn/android/reference/com/google/android/gms/safetynet/SafetyNet API 3、https://koz.io/inside-safetynet/ https://blog.csdn.net/gulinxieying/art…

必过SafetyNet!以MIUI开发版系统为例详解Android设备通过SafetyNet校验方法

必过SafetyNet&#xff01;以MIUI开发版系统为例详解Android设备通过SafetyNet校验方法 作者 梓沐啊_&#xff08;KylinDemons&#xff09; 版权声明 Copyright © 2021 KylinDemons. All rights reserved. 本文将在CSDN由作者KylinDemons、在酷安由梓沐啊_、在QQ空间…

初识SafetyNet简要梳理

目录 前序 2 什么是SafetyNet校验&#xff1f; 2 Safetynet工作原理 2 监控及校验内容 2 实现方式 3 参考文献&#xff1a; 4 前序 由于近年来Android支付应用的兴起&#xff0c;一些人在root过的手机上发现该类支付性质的应用无法使用。原来&#xf…

【Android安全】Google Hardware-backed Keystore | SafetyNet | 远程证明Remote Attestation

Google Hardware-backed KeyStore Attestation 原理及流程 SafetyNet Hardware-backed Attestation SafetyNet Hardware-backed Attestation&#xff1a;使用了Hardware-backed Keystore SafetyNet 支持Software Attestation 和 Hardware-backed Attestation&#xff0c;根据…

SafetyNet简要梳理

目录 前序 2 什么是SafetyNet校验&#xff1f; 2 Safetynet工作原理 2 监控及校验内容 2 实现方式 3 参考文献&#xff1a; 4 前序 由于近年来Android支付应用的兴起&#xff0c;一些人在root过的手机上发现该类支付性质的应用无法使用。原来&#xf…

什么是跨域?以及解决方案

现在的web项目&#xff0c;很多都是前后端分离&#xff0c;特别容易出现跨域问题 那么什么是跨域问题呢?本篇文章带你彻底从本质上弄明白什么是跨域问题以及如何解决 一、跨域有什么现象 首先我们看一下现象&#xff0c;如何出现的跨域问题。例&#xff1a; 前段&#xff1a…

跨域问题与解决方案

什么是跨域问题&#xff1f; 跨域问题的产生&#xff0c;源自浏览器的同源策略&#xff1a;SOP&#xff08;Same origin policy&#xff09;。 同源策略是由 Netscape 提出的一个著名的安全策略&#xff0c;它是浏览器最核心也是最基本的安全功能&#xff0c;所有支持 JavaSc…

跨域常见的解决方案

目录 一&#xff1a;什么是跨域 二&#xff1a;为什么会跨域 三&#xff1a;跨域的解决方案 1.代理服务器 1.1.生产环境 1.2.开发环境 2.JSONP 3.CORS 一&#xff1a;什么是跨域 跨域是指浏览器在向一个服务器发送请求时&#xff0c;该请求的地址与当前页面的地址不同…

React跨域解决方案

一、业务场景&#xff1a; 前后端数据交互时会存在跨域的情况&#xff0c;这个时候就比较难受。传统的解决方案有三种&#xff0c;分别是 Jsonp&#xff1a;但是只能处理get请求 后端CORS&#xff1a;配置注解CrossOrigin&#xff08;用的最多&#xff09; 反向代理 &#xff1…

10 种跨域解决方案(附终极方案)

写在前面 嗯。又来了&#xff0c;又说到跨域了&#xff0c;这是一个老生常谈的话题&#xff0c;以前我觉得这种基础文章没有什么好写的&#xff0c;会想着你去了解底层啊&#xff0c;不是很简单吗。但是最近在开发一个 vscode 插件 发现&#xff0c;当你刚入门一样东西的时候&…

可能是最好的跨域解决方案了

今天我们来聊一个老生常谈的话题&#xff0c;跨域&#xff01;又是跨域&#xff0c;烦不烦 &#xff1f;网上跨域的文章那么多&#xff0c;跨的我眼睛都疲劳了&#xff0c;不看了不看了 &#x1f923; 别走...我尽量用最简单的方式将常见的几种跨域解决方案给大家阐释清楚&…

跨域问题解决方案

跨域问题产生的前提条件 必须要有浏览器&#xff0c;没有浏览器&#xff0c;是不存在跨域问题。浏览器为了安全问题&#xff0c;限制了跨域访问&#xff0c;不允许跨域请求资源。 跨域 浏览器从一个域名的网页去请求另一个域名的资源&#xff0c;域名、端口、协议有任何一个…

跨域理解与解决方案

一 、跨域是啥 为啥会发生&#xff1f; 跨域本质是浏览器基于同源策略的一种安全手段&#xff0c;是一种约定&#xff0c;它是浏览器最核心也最基本的安全功能&#xff0c;如果缺少了同源策略&#xff0c;则浏览器的正常功能可能都会受到影响。可以说 Web 是构建在同源策略基础…

Vue中的跨域解决方案

前言 跨域是因为浏览器存在对不同源页面数据接收的限制。这种限制就是浏览器的同源策略。 同源策略是浏览器的安全机制&#xff0c;跨域的原理就是通过各种方式避开浏览器的安全机制 使用 在项目开发时&#xff0c;对跨域的概念仅限于了解&#xff0c;所以没有注重过程&#xf…

Vue跨域解决方案

文章目录 前言一、跨域是什么&#xff1f;二、解决跨域的办法 前言 跨域错误信息 Access to XMLHttpRequest at ‘http://192.168.2.92:3000/api/b/home’ from origin ‘http://localhost:8080’ has been blocked by CORS policy: Response to preflight request doesn’t …