后端接口防止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
英文地址,請注明出處:http://en.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…