后端接口防止XSS漏洞攻击

        有这样一个场景,首先构建一个docx文件并插入超链接(恶意的链接),上传到文件服务器后获取对应的文件filekey。现在我们提供一个预览接口,通过filekey便可以预览,在根据filekey转html文档返回给页面的时候由于插入的超链接成功触发XSS攻击;

        初始预览接口代码示例如下:

@GetMapping(value = "/wordConvertHtml/{fileKey}")@ApiImplicitParam(name = "fileKey", value = "文件唯一key", required = true)public void wordConvertHtml(@PathVariable String fileKey, HttpServletResponse response) throws IOException {OutputStream bos = null;try {InputStreamVO inputStreamVO = commonFileService.getInputStreamWithAuthCheck(fileKey);Document doc = new Document(inputStreamVO.getInputStream());HtmlSaveOptions opts = new HtmlSaveOptions(SaveFormat.HTML);opts.setExportXhtmlTransitional(true);opts.setExportImagesAsBase64(true);opts.setExportPageSetup(true);opts.setPrettyFormat(true);}catch (FileCorruptedException e) {log.error("word转换HTML发生特定异常:{}", e);// 给前端提示特殊信息PrintWriter out = new PrintWriter(bos);out.println("文件含有特殊格式,系统不兼容。");out.flush();out.close();} catch (Exception e) {log.error("word转换HTML异常", e);// 给前端提示信息response.setContentType("text/html; charset=UTF-8");PrintWriter out = new PrintWriter(bos);out.println(e.getMessage());out.flush();out.close();} finally {if (bos != null) {bos.close();}}}

处理方式:

       添加更全面的安全头设置:确保所有可能返回HTML内容的路径都设置了适当的安全头

1.Content-Security-Policy (CSP)

response.setHeader("Content-Security-Policy", "default-src 'none'; script-src 'none'; style-src 'unsafe-inline'; img-src data:;");

这是一个重要的安全特性,用于防止跨站脚本攻击(XSS)、点击劫持等攻击:

  • default-src 'none': 默认情况下不允许从任何源加载资源
  • script-src 'none': 不允许执行任何JavaScript代码
  • style-src 'unsafe-inline': 允许内联样式(如<style>标签和style属性)
  • img-src data:: 只允许通过data URI加载图片

这种配置可以有效防止恶意脚本注入,同时允许内联样式和内嵌图片显示。

2.X-Content-Type-Options

response.setHeader("X-Content-Type-Options", "nosniff");

防止浏览器尝试猜测或"嗅探"响应的内容类型:

  • 浏览器会严格按照服务器提供的Content-Type头来处理内容
  • 防止某些类型的攻击,比如将JavaScript文件当作图片显示

3.X-Frame-Options

response.setHeader("X-Frame-Options", "DENY");

防止页面被嵌入到iframe中,用于防止点击劫持攻击:

  • DENY: 页面不能被嵌入到任何iframe中
  • 这可以防止恶意网站将你的页面嵌入到他们的网站中进行钓鱼攻击

4.X-XSS-Protection

response.setHeader("X-XSS-Protection", "1; mode=block");

启用浏览器的内置XSS过滤器:

  • 1: 启用XSS过滤
  • mode=block: 当检测到XSS攻击时,浏览器会阻止整个页面加载,而不是仅仅过滤掉可疑内容

最后统一对错误进行处理,这样安全等级会更高。


@GetMapping(value = "/wordConvertHtml/{fileKey}")
@ApiImplicitParam(name = "fileKey", value = "文件唯一key", required = true)
public void wordConvertHtml(@PathVariable String fileKey, HttpServletResponse response) throws IOException {OutputStream bos = null;try {bos = response.getOutputStream();response.setHeader("Content-Security-Policy", "default-src 'self'; script-src 'none'; style-src 'self' 'unsafe-inline';");response.setHeader("X-Content-Type-Options", "nosniff");response.setHeader("X-Frame-Options", "DENY");response.setHeader("X-XSS-Protection", "1; mode=block");InputStreamVO inputStreamVO = commonFileService.getInputStreamWithAuthCheck(fileKey);Document doc = new Document(inputStreamVO.getInputStream());HtmlSaveOptions opts = new HtmlSaveOptions(SaveFormat.HTML);opts.setExportXhtmlTransitional(true);opts.setExportImagesAsBase64(true);opts.setExportPageSetup(true);opts.setPrettyFormat(true);doc.save(bos, opts);} catch (FileCorruptedException e) {log.error("word转换HTML发生特定异常:{}", e);// 给前端提示特殊信息// 设置安全响应头response.setContentType("text/html; charset=UTF-8");response.setHeader("Content-Security-Policy", "default-src 'none'; script-src 'none';");response.setHeader("X-Content-Type-Options", "nosniff");response.setHeader("X-Frame-Options", "DENY");PrintWriter out = new PrintWriter(bos);out.println("文件含有特殊格式,系统不兼容。");out.flush();out.close();} catch (Exception e) {log.error("word转换HTML异常", e);// 给前端提示信息// 设置安全响应头response.setContentType("text/html; charset=UTF-8");response.setHeader("Content-Security-Policy", "default-src 'none'; script-src 'none';");response.setHeader("X-Content-Type-Options", "nosniff");response.setHeader("X-Frame-Options", "DENY");PrintWriter out = new PrintWriter(bos);out.println(HtmlUtils.htmlEscape(e.getMessage()));out.flush();out.close();} finally {if (bos != null) {bos.close();}}
}

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

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

相关文章

4.1Vue基本使用

1.使用Vue-引入 Vue 的本质,就是一个 JavaScript 的库: 刚开始我们不需要把它想象的非常复杂; 我们就把它理解成一个已经帮我们封装好的库; 在项目中可以引入并且使用它即可。 那么安装和使用 Vue 这个 JavaScript 库有哪些方式呢? 方式一:在页面中通过 CDN 的方式来引…

CAD绘图:杂项

一、样式标注管理器 新建CAD图纸的样式标注是定死的,需要手动去改变合适的大小 1)命令行中直接输入“D”,打开样式标注管理器 2)点击“修改”,可以改变其颜色,线条样式以及文字大小、颜色、字体等 3)若想添加字体: a)在网上下载需要的字体 b)右键Auto CAD图标(…

Git上有更新而本地无更新时的解决方案

问题分析 分支名称不匹配&#xff1a;你尝试推送到 main 分支&#xff0c;但你当前在 master 分支上远程仓库有新内容&#xff1a;远程仓库包含你本地没有的提交&#xff0c;需要先拉取 解决方案 方法1&#xff1a;继续使用 master 分支 # 1. 先拉取远程更改 git pull origin m…

用于骨盆骨折复位与固定自动术前手术规划的基于几何的端到端流水线|文献速递-最新医学人工智能文献

Title题目An End-to-End Geometry-Based Pipeline forAutomatic Preoperative Surgical Planning ofPelvic Fracture Reduction and Fixation用于骨盆骨折复位与固定自动术前手术规划的基于几何的端到端流水线01文献速递介绍骨盆骨折及其术前规划相关研究背景与本文方法 骨盆骨…

【导航】OS复习

【OS】操作系统概述-CSDN博客 【OS】PV-CSDN博客 【OS】进程与线程-CSDN博客 【OS】文件管理-CSDN博客 【OS】IO_检查用户io请求的合法性-CSDN博客

Google Nano-banana AI模型图像生成能力实证分析:基于47个案例的系统化技术验证

Google Nano-banana AI模型官方示例库&#xff08;Awesome-Nano-Banana&#x1f34c;-images&#xff09;&#xff0c;通过系统化分析47个技术案例&#xff0c;实证验证其在图像生成、编辑与转换任务中的核心能力。所有测试基于Apache 2.0开源许可的公开案例数据集&#xff0c;…

MySQL 多表操作与复杂查询:深入理解多表关系和高级查询

大家好&#xff01;今天我们要深入探讨 MySQL 中两个非常重要的主题——多表操作 和 复杂查询。一. 多表操作什么是多表操作&#xff1f;在实际应用中&#xff0c;数据通常分布在多个表中&#xff0c;需要通过多表操作来获取完整信息。比如&#xff0c;一个学生表和一个课程表之…

Java入门级教程7——eclipse新建Maven项目,创建和连接数据库,创建数据库表

目录 1.若没有Maven项目&#xff0c;可以选择新建 2.添加Maven依赖 3.数据库的创建 3.1 新建连接 --> 创建数据库 3.2 创建数据库表 4.连接数据库 1.若没有Maven项目&#xff0c;可以选择新建 步骤一&#xff1a;点击 File --> New --> Project 步骤二&#xf…

请求库-axios

Axios 是一个基于 Promise 的 HTTP 客户端库&#xff0c;用于浏览器和 Node.js 环境。它支持发送异步 HTTP 请求&#xff0c;并提供了简洁的 API 来处理请求和响应。1、安装axios因为axios是一个第三方库&#xff0c;所以在使用之前我们需要先安装第三方模块。安装 Axios 需通过…

电子烟的4种屏幕驱动集成语音方案介绍

目前电子烟在全球市场的表现非常不错&#xff0c;很多国产电子烟厂家都有非常不错的产品&#xff0c;而屏幕驱动方案是电子烟智能化的重要组成部分&#xff0c;今天就给大家带来电子烟的4种主流屏幕驱动方案(含2025年最新版方案)。​  方案一、LED显示方案语音播报集成方案 W…

无法加载 DLL“xxxxxxx.dll”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)。

(无法加载 DLL“xxxxxxx.dll”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)。) 这个错误&#xff1a; 无法加载 DLL“ZH_P2P_Libx64.dll”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E) 意味着你的程序在运行时试图加载一个名为 xxxxxxx.dll 的动态链接库&#…

Flask/Django 生产部署:Gunicorn vs Nginx,Windows 与 Linux 实战指引

Flask/Django 生产部署&#xff1a;Gunicorn vs Nginx&#xff0c;Windows 与 Linux 实战指引 TL;DR Gunicorn&#xff1a;Python WSGI 应用服务器&#xff0c;运行 Flask/Django&#xff08;Linux 用&#xff09;。Nginx&#xff1a;反向代理/网关&#xff08;TLS、静态、限流…

Nginx 优化与防盗链全解析:从性能调优到资源保护

Nginx 优化与防盗链全解析&#xff1a;从性能调优到资源保护 文章目录Nginx 优化与防盗链全解析&#xff1a;从性能调优到资源保护一、基础安全优化&#xff1a;隐藏版本号1.1 查看当前版本号1.2 两种隐藏/修改方案方案一&#xff1a;修改配置文件&#xff08;快速隐藏&#xf…

HOT100--Day20--39. 组合总和,22. 括号生成,79. 单词搜索

HOT100–Day20–39. 组合总和&#xff0c;22. 括号生成&#xff0c;79. 单词搜索 每日刷题系列。今天的题目是《力扣HOT100》题单。 题目类型&#xff1a;回溯。 关键&#xff1a;掌握排列&#xff0c;组合。记得回溯。可以重复选的话&#xff0c;下一层index从哪里开始&#x…

高并发场景下的“命令执行”注入绕道记

环境&#xff1a;CentOS 8 OpenResty 1.21 PHP-FPM 8.0 背景&#xff1a;营销团队上线了一个“图片裁剪”接口&#xff0c;参数直接拼进 shell_exec&#xff0c;结果被打成“矿机”。1. 发现&#xff1a;流量突增 30 倍&#xff0c;却不见数据库慢查询 iftop -i eth0出站 1.8…

【modbus学习】

Modbus通信&#xff08;源于施耐德&#xff09;串行链路&#xff1a;RTU&#xff08;传输大量数据&#xff0c;适合工业&#xff09;、ASCII&#xff08;少量数据&#xff0c;适合计算机&#xff09;TCP/IP&#xff1a;TCP&#xff08;传输严谨&#xff0c;效率低&#xff09;、…

Redis单线程模型为什么快?

Redis的单线程模型指的是redis只使用一个线程来出来所有的命令式指令&#xff0c;但是不是意味着redis内部就只使用一个线程来处理所有的任务。都知道redis是一个客户端-服务器的程序&#xff0c;那么redis就只有一个服务器&#xff0c;但是有多个客户端&#xff0c;就像mysql一…

前端安全攻防:XSS, CSRF 等常见威胁的防范与检测指南

在如今高度互联的 Web 应用世界里&#xff0c;前端安全不再是可有可无的选项&#xff0c;而是构建可信赖、健壮应用的基石。随着 Web 技术的发展&#xff0c;攻击者们也变得越来越狡猾&#xff0c;前端遭受的攻击手段层出不穷。其中&#xff0c;跨站脚本攻击 (XSS) 和跨站请求伪…

Scikit-learn Python机器学习 - 特征降维 压缩数据 - 特征选择 - 移除低方差特征(VarianceThreshold)

锋哥原创的Scikit-learn Python机器学习视频教程&#xff1a; 2026版 Scikit-learn Python机器学习 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 课程介绍 本课程主要讲解基于Scikit-learn的Python机器学习知识&#xff0c;包括机器学习概述&#xff0c;特征工程(数据…

C#(链表创建与原地反转)

链表创建&#xff08;C#&#xff09; 在C#中&#xff0c;链表可以通过自定义节点类实现。每个节点包含数据域和指向下一个节点的引用。 public class ListNode {public int val;public ListNode next;public ListNode(int val0, ListNode nextnull) {this.val val;this.next…