当前位置: 首页 > article >正文

XSS ..

Web安全中的XSS攻击详细教学,Xss-Labs靶场通关全教程(建议收藏) - 白小雨 - 博客园跨站脚本攻击(XSS)主要是攻击者通过注入恶意脚本到网页中,当用户访问该页面时,恶意脚本会在用户的浏览器中执行,从而可能导致数据被篡改、用户信息泄露等问题。为了防止 XSS 攻击导致的数据篡改,可以从输入验证与过滤、输出编码、设置 CSP、HttpOnly 等方面着手,以下是详细介绍:

输入验证与过滤

  • 原理:在数据进入应用程序之前,对用户输入进行严格的验证和过滤,只允许合法的字符和格式通过。
  • 示例:在使用 JavaScript 编写表单验证时,可使用正则表达式来验证用户输入是否符合预期。
function validateInput(input) {// 只允许字母和数字const regex = /^[a-zA-Z0-9]+$/;return regex.test(input);
}const userInput = document.getElementById('userInput').value;
if (validateInput(userInput)) {// 处理合法输入
} else {// 提示用户输入不合法
}

输出编码

  • 原理:在将数据输出到 HTML、JavaScript、CSS 等环境中时,对特殊字符进行编码,将其转换为 HTML 实体或其他安全的表示形式,防止恶意脚本的注入。
  • 示例:在 Node.js 中使用 he 库对输出进行 HTML 编码。
const he = require('he');
const userInput = '<script>alert("XSS")</script>';
const encodedInput = he.encode(userInput);
// 输出编码后的内容,如 &lt;script&gt;alert(&quot;XSS&quot;)&lt;/script&gt;
console.log(encodedInput); 

设置内容安全策略(CSP)

  • 原理:通过设置 HTTP 头信息,指定页面可以加载哪些资源(如脚本、样式表、图片等),从而限制恶意脚本的加载和执行。
  • 示例:在 Node.js 的 Express 框架中设置 CSP 头信息。
const express = require('express');
const app = express();app.use((req, res, next) => {res.setHeader('Content-Security-Policy', "default-src 'self'; script-src 'self'");next();
});app.get('/', (req, res) => {res.send('Hello, World!');
});const port = 3000;
app.listen(port, () => {console.log(`Server is running on port ${port}`);
});

使用 HttpOnly 属性

  • 原理:对于存储敏感信息的 Cookie,设置 HttpOnly 属性,这样 JavaScript 脚本就无法访问这些 Cookie,从而防止攻击者通过 XSS 攻击窃取或篡改 Cookie 中的数据。
  • 示例:在 Node.js 的 Express 框架中设置带有 HttpOnly 属性的 Cookie。
const express = require('express');
const app = express();app.get('/', (req, res) => {res.cookie('session_id', '123456', { httpOnly: true });res.send('Cookie has been set');
});const port = 3000;
app.listen(port, () => {console.log(`Server is running on port ${port}`);
});

避免内联事件和内联脚本

  • 原理:内联事件(如 onclickonload)和内联脚本容易受到 XSS 攻击,应尽量避免使用。可以通过分离 HTML、CSS 和 JavaScript 代码,使用事件委托等方式来处理事件。
  • 示例:不推荐的内联事件写法:
<button onclick="alert('Hello')">点击我</button>

推荐的事件委托写法:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8">
</head><body><button id="myButton">点击我</button><script>const button = document.getElementById('myButton');button.addEventListener('click', () => {alert('Hello');});</script>
</body></html>

定期更新和修复漏洞

  • 原理:及时更新使用的框架、库和服务器软件,修复已知的安全漏洞,减少被攻击的风险。同时,对应用程序进行定期的安全审计和漏洞扫描,及时发现和处理潜在的安全问题。

在处理潜在的不信任输入时,直接使用 innerHTML 是非常危险的,因为它可以导致跨站脚本攻击(XSS)。当您将不受信任的数据插入到网页中时,如果使用了 innerHTML,那么这段数据可能会包含恶意脚本,这些脚本会在用户的浏览器上执行。

例如,如果你直接从用户输入获取数据并将其赋值给 innerHTML,如下所示:

const userInput = "<img src='x' onerror='alert(\"XSS\")'>";
someElement.innerHTML = userInput;

在这种情况下,用户的输入包含了恶意脚本,它会创建一个带有错误图片链接的 <img> 标签,并且当加载图像失败时触发 onerror 事件,从而执行 JavaScript 警告框。这种行为就是 XSS 攻击的一个简单例子。

为了避免这种情况,你应该尽量避免直接使用 innerHTML 来插入不信任的内容。如果必须使用,应该确保对内容进行适当的转义或清理,以去除任何可能的脚本元素或其他危险代码。更安全的选择是使用文本显示方法如 textContent 或者 innerText 来显示不信任的内容,因为它们不会解析 HTML,因此不会执行其中的脚本。

另外,对于一些特定场景,比如需要允许某些格式化但不允许脚本执行,可以考虑使用库如 DOMPurify 对输入进行清理,这样可以安全地移除潜在的有害部分但仍保留一定的富文本格式。例如:

import DOMPurify from 'dompurify';const cleanUserInput = DOMPurify.sanitize(userInput);
someElement.innerHTML = cleanUserInput;

总之,在处理用户输入时务必小心谨慎,尤其是在将其插入到页面中时,应采取一切必要措施防止 XSS 攻击。

1. 输入验证

使用正则表达式对用户输入进行验证,只允许特定字符通过,避免恶意脚本注入。

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>输入验证防止 XSS</title>
</head><body><input type="text" id="userInput" placeholder="请输入内容"><button id="submitButton">提交</button><div id="output"></div><script>function validateInput(input) {// 只允许字母、数字、空格和常见标点符号const regex = /^[a-zA-Z0-9\s.,!?]+$/;return regex.test(input);}const inputElement = document.getElementById('userInput');const submitButton = document.getElementById('submitButton');const outputElement = document.getElementById('output');submitButton.addEventListener('click', function () {const userInput = inputElement.value;if (validateInput(userInput)) {// 处理合法输入outputElement.textContent = `你输入的内容是: ${userInput}`;} else {outputElement.textContent = '输入包含非法字符,请重新输入。';}});</script>
</body></html>

在这个示例中,validateInput 函数使用正则表达式对用户输入进行验证,确保输入只包含字母、数字、空格和常见标点符号。如果输入合法,将其显示在页面上;否则,给出错误提示。

2. 输出编码

将用户输入的内容进行 HTML 实体编码,避免浏览器将其解析为 HTML 标签或脚本。可以使用 DOMPurify 库来实现。首先需要引入 DOMPurify 库,你可以通过 CDN 引入:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>输出编码防止 XSS</title><script src="https://cdnjs.cloudflare.com/ajax/libs/dompurify/2.3.11/purify.min.js"></script>
</head><body><input type="text" id="userInput" placeholder="请输入内容"><button id="submitButton">提交</button><div id="output"></div><script>const inputElement = document.getElementById('userInput');const submitButton = document.getElementById('submitButton');const outputElement = document.getElementById('output');submitButton.addEventListener('click', function () {const userInput = inputElement.value;// 使用 DOMPurify 进行净化const clean = DOMPurify.sanitize(userInput);outputElement.innerHTML = clean;});</script>
</body></html>

在这个示例中,当用户点击提交按钮时,使用 DOMPurify.sanitize 方法对用户输入进行净化,将其中的恶意脚本等危险内容过滤掉,然后将净化后的内容插入到页面中。

3. 避免使用内联事件和内联脚本

内联事件(如 onclickonload)和内联脚本容易受到 XSS 攻击,应尽量避免使用。可以通过事件委托等方式来处理事件。

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>避免内联事件防止 XSS</title>
</head><body><button id="myButton">点击我</button><div id="output"></div><script>const button = document.getElementById('myButton');const outputElement = document.getElementById('output');button.addEventListener('click', function () {outputElement.textContent = '按钮被点击了';});</script>
</body></html>

在这个示例中,使用 addEventListener 方法为按钮添加点击事件,而不是使用内联的 onclick 事件,这样可以避免潜在的 XSS 风险。

4. 使用 textContent 而不是 innerHTML

当需要向页面插入文本内容时,使用 textContent 而不是 innerHTML,因为 textContent 会将内容作为纯文本处理,不会解析其中的 HTML 标签。

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>使用 textContent 防止 XSS</title>
</head><body><input type="text" id="userInput" placeholder="请输入内容"><button id="submitButton">提交</button><div id="output"></div><script>const inputElement = document.getElementById('userInput');const submitButton = document.getElementById('submitButton');const outputElement = document.getElementById('output');submitButton.addEventListener('click', function () {const userInput = inputElement.value;// 使用 textContent 插入内容outputElement.textContent = userInput;});</script>
</body></html>

在这个示例中,使用 textContent 将用户输入的内容插入到页面中,确保内容以纯文本形式显示,避免 HTML 标签和脚本的执行。

相关文章:

XSS ..

Web安全中的XSS攻击详细教学&#xff0c;Xss-Labs靶场通关全教程&#xff08;建议收藏&#xff09; - 白小雨 - 博客园跨站脚本攻击&#xff08;XSS&#xff09;主要是攻击者通过注入恶意脚本到网页中&#xff0c;当用户访问该页面时&#xff0c;恶意脚本会在用户的浏览器中执行…...

网页版部署MySQL + Qwen3-0.5B + Flask + Dify 工作流部署指南

1. 安装MySQL和PyMySQL 安装MySQL # 在Ubuntu/Debian上安装 sudo apt update sudo apt install mysql-server sudo mysql_secure_installation# 启动MySQL服务 sudo systemctl start mysql sudo systemctl enable mysql 安装PyMySQL pip install pymysql 使用 apt 安装 My…...

WEBSTORM前端 —— 第2章:CSS —— 第8节:网页制作2(小兔鲜儿)

目录 1.项目目录 2.SEO 三大标签 3.Favicon 图标 4.版心 5.快捷导航(shortcut) 6.头部(header) 7.底部(footer) 8.banner 9.banner – 圆点 10.新鲜好物(goods) 11.热门品牌(brand) 12.生鲜(fresh) 13.最新专题(topic) 1.项目目录 【xtx-pc】 ima…...

仓储车间安全革命:AI叉车防撞装置系统如何化解操作风险

在现代物流体系中&#xff0c;仓储承担着货物储存、保管、分拣和配送等重要任务。但现代仓储行业的安全现状却不容乐观&#xff0c;诸多痛点严重制约着其发展&#xff0c;其中叉车作业的安全问题尤为突出。相关数据显示&#xff0c;全球范围内&#xff0c;每年因叉车事故导致的…...

gin + es 实践 08

自动扩缩容 本文档详细介绍如何在Kubernetes环境中实现Go-ES应用的自动扩缩容&#xff0c;包括水平Pod自动扩缩容(HPA)、垂直Pod自动扩缩容(VPA)和集群自动扩缩容。 1. 自动扩缩容概述 自动扩缩容是指根据负载变化自动调整计算资源的过程&#xff0c;主要目标是&#xff1a;…...

在Postman中高效生成测试接口:从API文档到可执行测试的完整指南

引言 在API开发与测试流程中,Postman是一款高效的工具,能将API文档快速转化为可执行的测试用例。本文以《DBC协议管理接口文档》为例,详细讲解如何通过Postman实现接口的创建、配置、批量生成及自动化测试,帮助开发者和测试人员提升效率,确保接口质量。 一、准备工作:理…...

修改图像分辨率

在这个教程中&#xff0c;您将学习如何使用Python和深度学习技术来调整图像的分辨率。我们将从基础的图像处理技术开始&#xff0c;逐步深入到使用预训练的深度学习模型进行图像超分辨率处理。 一、常规修改方法 1. 安装Pillow库 首先&#xff0c;你需要确保你的Python环境中…...

2025.05.08-得物春招算法岗-第二题

📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 02. 数字魔术分割 问题描述 LYA是一位数字魔术师,他有一个特殊的技能可以对任意一个正整数的数字进行重新排列,然后将排列后的数字序列分割成若干段,每段组成一个新的数字,最后…...

Node.js面试题

一、什么是Node.js&#xff1f; Node.js 是一个开源的跨平台 JavaScript 运行时环境&#xff0c;允许开发者在服务器端运行 JavaScript 代码。它基于 Chrome 的 V8 JavaScript 引擎构建&#xff0c;能够高效地处理 I/O 操作&#xff0c;适合构建高性能的网络应用。 异步非阻塞&…...

Spring MVC Controller 方法的返回类型有哪些?

Spring MVC Controller 方法的返回类型非常灵活&#xff0c;可以根据不同的需求返回多种类型的值。Spring MVC 会根据返回值的类型和相关的注解来决定如何处理响应。 以下是一些常见的 Controller 方法返回类型&#xff1a; String: 最常见的类型之一&#xff0c;用于返回逻辑…...

Redis 主从同步与对象模型(四)

目录 1.淘汰策略 1.1 expire/pexpire&#xff08;设置键的过期时间&#xff09; 1.2 配置 1.maxmemory 2.maxmemory-policy 3.maxmemory-samples 2.持久化 2.1背景 2.2 fork 的写时复制机制 2.3 大 key 3.持久化方式 3.1 aof&#xff08;Apped Only File&#xff09…...

Linux系列:如何用perf跟踪.NET程序的mmap泄露

一&#xff1a;背景 1. 讲故事 如何跟踪.NET程序的mmap泄露&#xff0c;这个问题困扰了我差不多一年的时间&#xff0c;即使在官方的github库中也找不到切实可行的方案&#xff0c;更多海外大佬只是推荐valgrind这款工具&#xff0c;但这款工具底层原理是利用模拟器&#xff…...

如何租用服务器并通过ssh连接远程服务器终端

这里我使用的是智算云扉 没有打广告 但确实很便宜 还有二十小时免费额度 链接如下 注册之后 租用新实例 选择操作系统 选择显卡型号 点击租用 选择计费方式 选择镜像 如果跑深度学习的话 就选项目对应的torch版本 没有的话 就创建纯净的cuda 自己安装 点击创建实例 创建之后 …...

Git的核心作用详解

一、版本控制与历史追溯 Git作为分布式版本控制系统&#xff0c;其核心作用是记录代码的每一次修改&#xff0c;形成完整的历史记录。通过快照机制&#xff0c;Git会保存每次提交时所有文件的完整状态&#xff08;而非仅记录差异&#xff09;&#xff0c;确保开发者可以随时回…...

华为设备链路聚合实验:网络工程实战指南

链路聚合就像为网络搭建 “并行高速路”&#xff0c;既能扩容带宽&#xff0c;又能保障链路冗余&#xff0c;超实用&#xff01; 一、实验拓扑速览 图中两台交换机 LSW1 和 LSW2&#xff0c;PC1、PC2 归属 VLAN 10&#xff0c;PC3 归属 VLAN 30。LSW1 与 LSW2 通过 GE0/0/1、…...

AUTOSAR图解==>AUTOSAR_TR_AIDesignPatternsCatalogue

AUTOSAR 人工智能设计模式目录 AUTOSAR传感器执行器与仲裁设计模式的深入解析与图解 目录 简介传感器和执行器模式 架构概述组件结构交互流程应用场景 多请求者或提供者之间的仲裁模式 架构概述组件结构仲裁流程应用场景 总结 1. 简介 AUTOSAR&#xff08;AUTomotive Open Sy…...

linux基础操作4------(权限管理)

一.前言 今天我们来讲讲linux的权限管理&#xff0c;比如文件的权限&#xff0c;如果大家看过前面说的app逆向的frida&#xff0c;我们在手机里要给frida&#xff0c;我们都要设置一下chomd 777 frida &#xff0c;这样就给了可执行权限&#xff0c;这就是这一章要讲的&#x…...

双系统电脑中如何把ubuntu装进外接移动固态硬盘

电脑&#xff1a;win11 ubuntu22.04 实体机 虚拟机&#xff1a;VMware17 镜像文件&#xff1a;ubuntu-22.04.4-desktop-amd64.iso 或者 ubuntu20.4的镜像 外接固态硬盘1个 一、首先win11中安装vmware17 具体安装方法&#xff0c;网上很多教程 二、磁盘分区 1.在笔…...

Nacos源码—Nacos集群高可用分析(三)

6.CAP原则与Raft协议 (1)CAP分别指的是什么 一.C指的是一致性Consistency 各个集群节点之间的数据&#xff0c;必须要保证一致。 二.A指的是可用性Availability 在分布式架构中&#xff0c;每个请求都能在合理的时间内获得符合预期的响应。 三.P指的是分区容错性Partition To…...

【C语言】程序的预处理,#define详解

一、预定义符号 二、#define 1.#define定义标识符 #define &#xff0b; 自定义名称 &#xff0b; 代替的内容 例&#xff1a; #define MAX 100 #define CASE break;case #define CASE break;caseint main() {int n 0;switch (n){case 1:CASE 2:CASE 3:CASE 4:}return …...

NVM完全指南:安装、配置与最佳实践

发布于 2025年5月7日 • 阅读时间&#xff1a;10分钟 &#x1f4a1; TL;DR: 本文详细介绍了如何完整卸载旧版Node.js&#xff0c;安装NVM&#xff0c;配置阿里云镜像源&#xff0c;以及设置node_global与node_cache目录&#xff0c;打造高效Node.js开发环境。 &#x1f4cb; 目…...

(二)毛子整洁架构(CQRS/Dapper/领域事件处理器/垂直切片)

文章目录 项目地址一、Application 层1.1 定义CQRS的接口以及其他服务1. Command2. IQuery查询3. 当前时间服务接口4. 邮件发送服务接口 1.2 ReserveBooking Command1. 处理传入的参数2. ReserveBookingCommandHandler3. BookingReservedDomainEvent 1.3 Query使用Sql查询1. 创…...

基于大核感知与非膨胀卷积的SPPF改进—融合UniRepLK的YOLOv8目标检测创新架构

在当前目标检测领域中,YOLO系列模型因其优异的速度-精度平衡能力而被广泛部署于工业界与科研场景。YOLOv8作为该系列的最新版本,在主干网络与特征金字塔结构上进行了多项优化,进一步提升了其实时性与鲁棒性。然而,其核心组件—SPPF(Spatial Pyramid Pooling Fast)模块仍采用…...

基于SpringBoot网上书店的设计与实现

pom.xml配置文件 1. 项目基本信息(没什么作用) <groupId>com.spring</groupId> <!--项目组织标识&#xff0c;通常对应包结构--> <artifactId>boot</artifactId> <!--项目唯一标识--> <version>0.0.1-SNAPSHOT</ve…...

小程序多线程实战

在小程序开发中&#xff0c;由于微信小程序的运行环境限制&#xff0c;原生并不支持传统意义上的多线程编程&#xff0c;但可以通过以下两种核心方案实现类似多线程的并发处理效果&#xff0c;尤其在处理复杂计算、避免主线程阻塞时非常关键&#xff1a; 一、官方方案&#xff…...

如何修改MySQL数据库密码

文章目录 一、忘记数据库密码该如何修改1. 关闭数据库的服务2.跳过安全检查3. 重置密码4.查询用户是否存在5.退出验证密码是否正确 二、未忘记密码该如何修改密码1.直接修改密码2.登录mysql 时间久了&#xff0c;忘记数据库密码了。。。。。 一、忘记数据库密码该如何修改 1. …...

【Python】mat npy npz 文件格式

1、简介 MAT 文件和 NP&#xff08;.npy 或 .npz&#xff09;文件是两种不同的格式&#xff0c;用于存储数组数据。它们分别由 MATLAB 和 NumPy 开发&#xff0c;主要用于各自环境中的数据存储和交换。以下是这两种格式的主要区别&#xff1a; 1.1 格式和用途 MAT 文件&…...

SpringBoot快速入门WebSocket(​​JSR-356附Demo源码)

现在我想写一篇Java快速入门WebSocket,就使用 JSR-356的websocket,我想分以下几点, 1. websocket介绍, 1.1 介绍 什么是WebSocket&#xff1f;​​ WebSocket 是一种基于 ​​TCP​​ 的​​全双工通信协议​​&#xff0c;允许客户端和服务器在​​单个长连接​​上实…...

JDBC执行sql过程

1. 加载数据库驱动​ JDBC 通过 ​​驱动&#xff08;Driver&#xff09;​​ 实现与不同数据库的通信。驱动需提前加载到 JVM&#xff1a; 手动加载&#xff08;JDBC 4.0 前&#xff09;​​&#xff1a; Class.forName("com.mysql.cj.jdbc.Driver"); // MySQL 驱…...

VNC windows连接ubuntu桌面

✅ 步骤 1&#xff1a;安装 VNC 服务器 首先&#xff0c;我们需要在 Winux 系统上安装一个 VNC 服务器。这里我们使用 tigervnc 作为例子&#xff0c;它是一个常用的 VNC 服务器软件。 打开终端并更新你的软件包&#xff1a; sudo apt update安装 tigervnc 服务器&#xff1a;…...