Xss漏洞问题
https://bu1.github.io/2021/01/12/%E7%AC%AC%E5%8D%81%E4%BA%8C%E5%91%A8%EF%BC%9AXSS%E6%BC%8F%E6%B4%9E%E5%AD%A6%E4%B9%A0%E5%AE%9E%E6%88%98/

后端绕开了前端,直接调用接口入库:
<select οnchange=“alert(1)”>12
前端拿到这个文本后,再富文本编辑器中,会将其解析为js脚本,从而实现xss攻击。
原始方案一:
1、前端调用接口的时候,不进行转义
2、后端入库的时候转义
3、后端返回给前端,前端对转义的数据进行反转义,这样就保证了不会有问题。
这个方案理解上存在的问题:
1、前端进行反转义是浏览器的行为,而不是什么拦截器或者代码,组件的行为机制;
2、为什么给后端的数据会自动的进行转义,这个是Angular框架自动的行为,类似的Vue也存在这种机制。
在前端开发中,自动转义的目的是为了 防止 XSS 攻击 和 确保用户输入的内容不会被浏览器误解析为 HTML 或 JavaScript 代码。当用户通过表单、URL 参数或其他方式输入数据时,如果这些输入数据未经处理直接插入到页面中,可能会导致恶意用户通过注入脚本来执行攻击。
前端自动转义的原因
-
防止 XSS 攻击:
XSS (跨站脚本攻击) 是一种常见的安全漏洞,攻击者可以通过注入恶意的 JavaScript 代码来执行一些不安全的操作,比如窃取用户信息或篡改页面内容。如果浏览器将用户输入的内容(如<script>alert('XSS')</script>)直接渲染为 HTML 代码,那么攻击者的脚本就会被执行。为了防止这种情况,很多现代框架和工具会对用户输入进行自动转义,确保它被当作纯文本呈现,而不是被执行。
-
确保数据的安全性:
转义字符(如<,>,&,")会将特殊字符转换成 HTML 实体,使它们无法作为 HTML 或 JavaScript 执行。这就能确保无论数据如何传递,浏览器都只会将其当作普通文本处理。
Angular 中的自动转义
Angular 是一个现代的前端框架,具有 自动防止 XSS 攻击 的机制。Angular 在将模板中的用户输入渲染到 DOM 时,会自动对数据进行转义,从而防止恶意脚本注入。具体来说,Angular 使用了一个叫做 安全上下文(Security Context) 的概念。
1. Angular 默认的自动转义
Angular 会对绑定到模板中的用户输入进行自动转义。无论是通过 {{ expression }} 或 [innerHTML] 插值,Angular 都会确保将用户提供的数据视为纯文本,而不会执行其中的 HTML 或 JavaScript 代码。
例子:
<div>{{ userInput }}</div>
如果 userInput 是来自用户的输入,Angular 会自动转义其中的 HTML 实体,如 < 被转义为 <,> 被转义为 >,从而避免用户输入的内容被浏览器解释为 HTML 标签或 JavaScript 代码。
2. 插值绑定和属性绑定
- 插值绑定:如
{{ userInput }},Angular 会自动将数据转义为文本。 - 属性绑定:如
[innerHTML]="userInput",如果直接将用户输入的内容绑定到innerHTML,Angular 默认 不转义,而是将其作为 HTML 渲染。这时,你需要小心处理用户输入,避免 XSS 攻击。
3. ng-bind 和 ng-bind-html
ng-bind:Angular 自动转义绑定的文本内容,类似于插值绑定{{}},并防止执行其中的 HTML 和 JavaScript。ng-bind-html:Angular 在将内容绑定到innerHTML时不会进行转义,需要手动处理 用户输入来防止 XSS。为了防止不安全的 HTML 被渲染,你可以使用 Angular 提供的DomSanitizer服务来清理内容。
DomSanitizer 防止 XSS
在 Angular 中,如果你必须通过 innerHTML 渲染用户输入的内容,推荐使用 DomSanitizer 来清理不安全的 HTML,确保内容不会被执行。DomSanitizer 允许你标记安全的 HTML 内容。
示例:
import { DomSanitizer, SafeHtml } from '@angular/platform-browser';@Component({selector: 'app-component',template: `<div [innerHTML]="safeHtmlContent"></div>`
})
export class MyComponent {safeHtmlContent: SafeHtml;constructor(private sanitizer: DomSanitizer) {}ngOnInit() {const userInput = '<script>alert("XSS")</script>';this.safeHtmlContent = this.sanitizer.bypassSecurityTrustHtml(userInput);}
}
在这个例子中,bypassSecurityTrustHtml 将用户输入的 HTML 标记为 信任的 HTML,Angular 不会对其进行自动转义。但通常,如果可能,应该避免直接使用 innerHTML,并考虑使用其他方式来安全地显示内容。
总结
- Angular 自动转义:对于大多数插值绑定,Angular 会自动对用户输入进行转义,确保它们不会被浏览器解释为 HTML 或 JavaScript。
- 手动控制转义:如果使用
innerHTML或类似方法直接渲染用户输入,需要小心 XSS 问题,可以使用 Angular 提供的DomSanitizer进行处理。 - 为什么自动转义:转义的目的是为了防止 XSS 攻击,确保用户输入不会执行恶意代码。
最终方案:
前端不变,后端在入库的时候,再进行一次转义。
前端进行转义后,后端再继续转义,不会有问题!因为转义只是对<等符号进行处理,两次转义后应该结果是相同的。
前端拿到转义的文字,在渲染的时候进行渲染,也不会有问题。
xss攻击基本知识:
未经转义的文本 会被浏览器解析并执行其中的 JavaScript(例如 )。
已转义的文本(例如 <script>alert(‘XSS’)</script>)会被浏览器当作普通文本显示,而不会执行其中的 JavaScript 代码。
双重转义不会造成安全问题,因为浏览器会把转义后的字符当做普通文本处理,不会执行其中的 JavaScript。
前端和后端的双重转义 可以确保更高的安全性,但它是冗余的,并且会增加字符的长度和复杂度。
前端渲染 转义后的内容时,浏览器会正确显示转义字符,不会有问题。
相关文章:
Xss漏洞问题
https://bu1.github.io/2021/01/12/%E7%AC%AC%E5%8D%81%E4%BA%8C%E5%91%A8%EF%BC%9AXSS%E6%BC%8F%E6%B4%9E%E5%AD%A6%E4%B9%A0%E5%AE%9E%E6%88%98/ 后端绕开了前端,直接调用接口入库: <select οnchange“alert(1)”>12 前端拿到这个文本后&…...
Python MongoDB速成教程
一、基础 1. 安装pymongo库 pymongo 是 Python 操作 MongoDB 的官方驱动,你可以使用 pip 来安装它: pip install pymongo 2. 连接到 MongoDB 首先,你需要建立与 MongoDB 服务器的连接。以下是一个简单的示例: from pymongo …...
Docker概念与架构
文章目录 概念docker与虚拟机的差异docker的作用docker容器虚拟化 与 传统虚拟机比较 Docker 架构 概念 Docker 是一个开源的应用容器引擎。诞生于 2013 年初,基于 Go 语言实现。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中…...
基于opencv消除图片马赛克
以下是一个基于Python的图片马赛克消除函数实现,结合了图像处理和深度学习方法。由于马赛克消除涉及复杂的图像重建任务,建议根据实际需求选择合适的方法: import cv2 import numpy as np from PIL import Imagedef remove_mosaic(image_pat…...
3.使用ElementUI搭建侧边栏及顶部栏
1. 安装ElementUI ElementUI是基于 Vue 2.0 的桌面端组件库。使用之前,需要在项目文件夹中安装ElementUI,在终端中输入以下命令,进行安装。 npm i element-ui -S并在main.js中引入ElementUI 2. 使用elmentUI组件进行页面布局 2.1 清空原…...
golang将大接口传递给小接口以及场景
文章目录 golang将大接口传递给小接口背景什么是大接口传递给小接口使用场景 golang将大接口传递给小接口 背景 在 Go 语言中,接口是一种强大的工具,它允许我们定义对象的行为而不关心其具体实现。特别是在复杂的应用程序中,将一个实现了较…...
C# OPC DA获取DCS数据(提前配置DCOM)
OPC DA配置操作手册 配置完成后,访问远程ip,就能获取到服务 C#使用Interop.OPCAutomation采集OPC DA数据,支持订阅(数据变化)、单个读取、单个写入、断线重连...
不同开发语言之for循环的用法、区别总结
一、Objective-C (1)标准的c风格 for (int i 0; i < 5; i) {NSLog("i %d", i); } (2)for in循环。 NSArray *array ["apple", "banana", "orange"]; for (NSString *fruit in …...
MuBlE:为机器人操作任务规划提供了逼真的视觉观察和精确的物理建模
2025-03-05,由华为诺亚方舟实验室、捷克技术大学和帝国理工学院联合开发的MuBlE(MuJoCo and Blender simulation Environment)模拟环境和基准测试。通过结合MuJoCo物理引擎和Blender高质量渲染,为机器人操作任务规划提供了逼真的视…...
工具介绍《HACKBAR V2》
HackBar V2 是一款功能强大的浏览器渗透测试工具,主要用于测试 SQL 注入、XSS 漏洞、POST 传参等安全场景。以下是其核心功能、用法及实际案例操作的综合介绍: 一、核心功能与用法详解 1. 基础操作 Load URL 功能:将当前浏览器地址栏的 URL …...
ASP.NET Core 6 MVC 文件上传
概述 应用程序中的文件上传是一项功能,用户可以使用该功能将用户本地系统或网络上的文件上传到 Web 应用程序。Web 应用程序将处理该文件,然后根据需要对文件进行一些验证,最后根据要求将该文件存储在系统中配置的用于保存文件的存储中&#…...
2025年03月07日Github流行趋势
项目名称:ai-hedge-fund 项目地址url:https://github.com/virattt/ai-hedge-fund项目语言:Python历史star数:12788今日star数:975项目维护者:virattt, seungwonme, KittatamSaisaard, andorsk, arsaboo项目…...
JAVA入门——网络编程简介
自己学习时的笔记,可能有点水( 以后可能还会补充(大概率不会) 一、基本概念 网络编程三要素: IP 设备在网络中的唯一标识 端口号 应用软件在设备中的唯一标识两个字节表示的整数,0~1023用于知名的网络…...
Cursor + IDEA 双开极速交互
相信很多开发者朋友应该和我一样吧,都是Cursor和IDEA双开的开发模式:在Cursor中快速编写和生成代码,然后在IDEA中进行调试和优化 在这个双开模式的开发过程中,我就遇到一个说大不大说小不小的问题: 得在两个编辑器之间来回切换查…...
3.3.2 用仿真图实现点灯效果
文章目录 文章介绍Keil生成.hex代码Proteus仿真图中导入.hex代码文件开始仿真 文章介绍 点灯之前需要准备好仿真图keil代码 仿真图参考前文:3.3.2 Proteus第一个仿真图 keil安装参考前文:3.1.2 Keil4安装教程 keil新建第一个项目参考前文:3.1…...
点云软件VeloView开发环境搭建与编译
官方编译说明 LidarView / LidarView-Superbuild GitLab 我的编译过程: 安装vs2019,windows sdk,qt5.14.2(没安装到5.15.7),git,cmake3.31,python3.7.9,ninja下载放到…...
Java入门:环境搭建与第一个HelloWorld程序
一、环境搭建前的准备 1. JDK vs JRE的区别 JRE(Java Runtime Environment):只能运行Java程序JDK(Java Development Kit):包含JRE 开发工具(javac/java等) ❗ 结论:开…...
PDF处理控件Aspose.PDF,如何实现企业级PDF处理
PDF处理为何成为开发者的“隐形雷区”? “手动调整200页PDF目录耗时3天,扫描件文字识别错误导致数据混乱,跨平台渲染格式崩坏引发客户投诉……” 作为开发者,你是否也在为PDF处理的复杂细节消耗大量精力?Aspose.PDF凭…...
大白话如何利用 CSS 实现一个三角形?原理是什么?
大白话如何利用 CSS 实现一个三角形?原理是什么? 答题思路 先说明实现三角形的方法基础:即利用 CSS 中元素的边框特性来构建三角形,让读者对整体思路有个初步概念。详细阐述具体的实现步骤:包括设置元素的基本样式&a…...
js操作字符串的常用方法
1. 查找和截取 1.1 indexOf 作用:查找子字符串在字符串中首次出现的位置。 是否改变原字符串:不会改变原字符串。 返回值:如果找到子字符串,返回其起始索引(从 0 开始);如果未…...
PostgreSQL 如何有效地处理数据的加密和解密
对安全级别要求较高的项目,对敏感数据都要求加密保存。 在 PostgreSQL 中处理数据的加密和解密可以通过多种方式实现,以确保数据的保密性和安全性。 我这里提供几种常见的方法。 一、使用 pgcrypto 扩展 pgcrypto 是 PostgreSQL 中一个常用的扩展&am…...
《2025年软件测试工程师面试》消息队列面试题
消息队列 消息队列(Message Queue,简称 MQ)是一种应用程序之间的通信方法。 基本概念 消息队列是一种先进先出(FIFO)的数据结构,它允许一个或多个消费者从队列中读取消息,也允许一个或多个生产者…...
大数据学习(55)-BI工具数据分析的使用
&&大数据学习&& 🔥系列专栏: 👑哲学语录: 承认自己的无知,乃是开启智慧的大门 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一下博主哦ᾑ…...
原生android 打包.aar到uniapp使用
1.原生安卓里面引入uniapp官方提供的包文件: uniapp-v8-release.aar 2.提供uniapp调用的接口,新建类文件继承UniModule, package com.dermandar.panoramal;import com.scjt.lib.certlib;import io.dcloud.feature.uniapp.annotation.UniJSM…...
解锁MacOS开发:环境配置与应用开发全攻略
✨✨✨这里是小韩学长yyds的BLOG(喜欢作者的点个关注吧) ✨✨✨想要了解更多内容可以访问我的主页 小韩学长yyds-CSDN博客 目录 引言 一、MacOS 开发环境配置 (一)必备工具安装 (二)集成开发环境(IDE)选…...
Aruco 库详解:计算机视觉中的高效标记检测工具
1. 引言:Aruco 在计算机视觉中的重要性 在计算机视觉领域,标记(Marker)检测和识别是许多应用的基础,包括 机器人导航、增强现实(AR)、相机标定(Calibration)以及物体跟踪…...
第005文-模拟入侵网站实现0元购
1、部署导入靶场,部署购物网站 首先在虚拟机中新增一个centos虚拟机,在上面部署一套完整的购物网站,使用mysql数据库,访问端口是80。这个新增的centos虚拟机就是我们的靶场。购物网站在网上随便找一套开源的部署即可。 2、在网站…...
unity3d 背景是桌面3d数字人,前面是web的表单
是可以实现的,但涉及多个技术栈的结合,包括 Unity3D、Web 技术(HTML、JavaScript)、以及可能的 WebGL 或 WebRTC 技术。大致有以下几种实现方案: 方案 1:Unity 作为独立应用(桌面端࿰…...
23种设计模式简介
一、创建型(5种) 1.工厂方法 总店定义制作流程,分店各自实现特色披萨(北京店-烤鸭披萨,上海店-蟹粉披萨) 2.抽象工厂 套餐工厂(家庭装含大披萨薯条,情侣装含双拼披萨红酒&#…...
淘宝关键字搜索接口爬虫测试实战指南
在电商数据分析和市场研究中,通过关键字搜索获取淘宝商品信息是一项重要任务。淘宝开放平台提供了 item_search 接口,允许开发者通过关键字搜索商品,并获取商品列表及相关信息。本文将详细介绍如何设计并测试一个基于该接口的爬虫程序&#x…...
