web前端安全性——JSONP劫持

1、JSONP概念

JSONP(JSON with Padding)是JSON的一種“使用模式”,可用于解決主流瀏覽器的跨域數據訪問的問題。由于同源策略,協議+IP+端口有任意不同都會導致請求跨域,而HTML的script元素是一個例外。利用script元素的這個開放策略,網頁可以得到從其他來源動態產生的JSON 資料。
代碼如下僅供參考
假設有一個遠程服務器 https://example.com/api/data,它返回以下 JSONP 格式的響應:

myCallback({"name": "John", "age": 30});

在前端,你可以創建一個 script標簽,并將其 src 屬性設置為該 URL,同時定義一個名為 myCallback 的函數來處理返回的 JSON 數據:

<!DOCTYPE html>  
<html lang="en">  
<head>  
<meta charset="UTF-8">  
<title>JSONP Example</title>  
<script>  // 定義回調函數  function myCallback(data) {  console.log(data); // 輸出:{name: "John", age: 30}  }  
</script>  
</head>  
<body>  
<script>  // 創建一個新的script標簽  var script = document.createElement('script');  // 設置script標簽的src屬性為遠程API的URL  script.src = 'https://example.com/api/data?callback=myCallback';  // 將新創建的script標簽添加到DOM中  document.body.appendChild(script);  
</script>  
</body>  
</html>

舉例:你可以在自己的界面建立搜索功能,但是搜索的數據等內容可以通過script標簽的src屬性為其他瀏覽器的URL ,那么你所搜索的數據就是來自于瀏覽器,也就是訪問到這個函數參數中的 JSON 數據…

2、JSONP劫持概念

通過JSONP技術可以實現數據的跨域訪問,必然會產生安全問題。如果網站B對網站A的JSONP請求沒有進行安全檢查直接返回數據,則網站B便存在JSONP漏洞,網站A利用JSONP漏洞能夠獲取用戶在網站B上的數據。

3、流程

(1)用戶在網站B注冊并登錄,網站B 包含了用戶的id,name,email等信息。
(2)用戶通過瀏覽器向網站A發出URL請求。
(3)網站A向用戶返回響應頁面,響應頁面中注冊了JavaScript的回調函數和向網站B請求的script標簽。
(4)用戶收到響應,解析JS代碼,將回調函數作為參數向網站B發出請求
(5)網站B接收到請求后,解析請求的URL,以JSON 格式生成請求需要的數據,將封裝的包含用戶信息的JSON數據作為回調函數的參數返回給瀏覽器。
(6)網站B數據返回后,瀏覽器則自動執行Callback函數對步驟4返回的JSON格式數據進行處理,通過alert彈窗展示了用戶在網站B的注冊信息。另外也可將JSON數據回傳到網站A的服務器,這樣網站A利用網站B的JSONP漏洞便獲取到了用戶在網站B注冊的信息。

4、JSPNP劫持的危害

(1)攻擊者利用存在漏洞的網站,將鏈接通過郵件等形式推送給受害者,如果受害者點擊了鏈接,則攻擊者便可以獲取受害者的個人敏感的信息。所以JSONP劫持漏洞會泄露信息。
(2)可能導致用戶權限被盜用:攻擊者通過JSON劫持構造盜取管理員或高權限用戶的腳本,一旦被訪問,權限立即被盜用。
(3)可以通過劫持對網頁進行掛馬;在JSON劫持點構造引向漏洞后門木馬,但訪問直接利用漏洞批量掛馬。
(4)可對劫持頁進行網站釣魚;利用JSON劫持直接導向偽裝網站地址
(5)可做提權攻擊。

5、JSONP劫持的防護

(1)限制referer
前端可以通過設置document.referrer屬性來限制Referer。雖然這并不能阻止攻擊者偽造Referer,但可以增加一層防護。
代碼如下僅供參考

// 設置或修改當前文檔的Referer  
document.referrer = 'https://trusted-domain.com';  
// 發起JSONP請求  
const script = document.createElement('script');  
script.src = 'https://example.com/api/data?callback=handleResponse';  
document.body.appendChild(script);  
function handleResponse(data) {  // 處理返回的數據  console.log(data);  
}

注意:由于Referer可以被偽造,所以僅僅依賴Referer來防止JSONP劫持是不夠的。它應該與其他安全措施結合使用。

(2)使用token
在前端,你可以通過添加一個自定義的token參數來增強JSONP請求的安全性。這個token可以是服務器生成的一個隨機字符串,并存儲在客戶端的某個安全位置(如localStorage)。在服務器端驗證該token。只有持有有效token的請求才會被處理。這樣可以防止未經授權的第三方發起JSONP請求。
代碼如下僅供參考

// 從安全存儲中獲取token  
const token = localStorage.getItem('secureToken');  
// 發起帶token的JSONP請求  
const script = document.createElement('script');  
script.src = `https://example.com/api/data?callback=handleResponse&token=${token}`;  
document.body.appendChild(script);  
function handleResponse(data) {  // 驗證token  if (data.token === token) {  // 處理返回的數據  console.log(data);  } else {  // token驗證失敗,可能是劫持攻擊  console.error('Invalid token, potential JSONP hijacking!');  }  
}

在服務器端,你還需要驗證這個token是否有效。只有當token有效時,才返回數據。這種方法可以增加攻擊者偽造有效請求的難度。

(3)不使用JSONP進行跨域(最直接的方法)
現代瀏覽器支持CORS(跨源資源共享)機制,它提供了更安全、更靈活的跨域解決方案。通過使用CORS,可以在不暴露數據給不安全腳本的情況下實現跨域通信。
代碼如下僅供參考
javascript

// 使用CORS替代JSONP  
fetch('https://example.com/api/data', {  method: 'GET',  mode: 'cors', // 表明這是一個跨域請求  headers: {  'Content-Type': 'application/json'  }  
})  
.then(response => response.json())  
.then(data => {  // 處理返回的數據  console.log(data);  
})  
.catch(error => {  console.error('Error:', error);  
});

使用CORS時,服務器需要正確配置響應頭部以允許跨域請求
http

Access-Control-Allow-Origin: https://your-frontend-domain.com  
Access-Control-Allow-Methods: GET, POST, PUT, DELETE  
Access-Control-Allow-Headers: Content-Type

通過上面措施,前端可以顯著減少JSONP劫持的風險。但是安全是一個綜合性的工作,前端和后端都需要共同努力來確保系統的安全性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/697214.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/697214.shtml
英文地址,請注明出處:http://en.pswp.cn/news/697214.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vscode【報錯】yarn : 無法將“yarn”項識別為 cmdlet

問題 CMD下載完yarn可以查看到yarn版本&#xff0c;但是進入到vscode控制臺報錯無法識別&#xff0c;報錯內容如下&#xff1a; vscode【報錯】yarn : 無法將“yarn”項識別為 cmdlet、函數、腳本文件或可運行程序的名稱。請檢查名稱的拼寫&#xff0c;如果包括路徑&#xff…

@ 代碼隨想錄算法訓練營第8周(C語言)|Day57(動態規劃)

代碼隨想錄算法訓練營第8周&#xff08;C語言&#xff09;|Day57&#xff08;動態規劃&#xff09; Day53、動態規劃&#xff08;● 1143.最長公共子序列 ● 1035.不相交的線 ● 53. 最大子序和 動態規劃 &#xff09; 1143.最長公共子序列 題目描述 給定兩個字符串 text1 …

C#面:i++ 和 ++i 的區別

i 先參與左邊的運算&#xff0c;之后 i 自增&#xff1b; int i 5; int result i; // result的值為5&#xff0c;i的值變為6 i i 先自增&#xff0c;之后的值&#xff0c;參與左邊的運算&#xff1b; int i 5; int result i; // result的值為6&#xff0c;i的值也為6…

【一步步由簡入深,搞定FFT,持續更新中...】

作為一個傾向于形象思維的工程師&#xff0c;總想把復雜深奧的知識搞的方便理解&#xff0c;雖然上學時學過數字信號處理&#xff0c;仍然一知半解&#xff0c;現在想借著項目中涉及到的頻譜相關知識總結下來&#xff0c;在了解中逐步完善。 好了&#xff0c;首先要明確的概念是…

ffmpeg for android編譯全過程與遇到的問題

編譯前準備 編譯環境&#xff1a;Ubuntu16&#xff0c;可自行下載VMWare最新版并百度永久許可證或在服務器上安裝Ubuntu ffmpeg源碼&#xff1a;ffmpeg4.2.2 NDK下載&#xff1a;Android NDK r21e 有條件的最好還是在Liunx平臺下編譯吧&#xff0c;Windows平臺下編譯坑更多…

【計算機網絡】數據鏈路層|封裝成幀|透明傳輸|差錯檢測|PPP協議|CSMA/CD協議

目錄 一、思維導圖 ? 二、數據鏈路層功能概述 1.數據鏈路層概述 2.數據鏈路層功能概述——封裝成幀 3.數據鏈路層功能概述——透明傳輸 4.數據鏈路層功能概述——差錯檢測 三、數據鏈路層重要協議 1.數據鏈路層重要協議&#xff1a;PPP協議 2.數據鏈路層重要協議&#x…

js設計模式:備忘錄模式

作用: 封裝的對象可以在對象觸發行為時進行狀態的記錄與保存 也可以進行狀態的回退,恢復之前的狀態 示例: class Editor{constructor(){this.allText }edit(text){this.allText text}saveNow(){return new EditorText(this.allText)}backspacing(editorText){this.allText…

護眼臺燈哪個品牌更好用?五大好用護眼臺燈大爆料!

護眼臺燈相信大家都有所耳聞或者使用過,家里有小孩的可能了解更深,畢竟是孩子學習時需要使用的小家電。現在市面上的護眼臺燈種類可以說是多到眼花繚亂,甚至有些劣質的產品摻雜在里面,或許有些寶媽已經踩過一些坑了&#xff0c;護眼臺燈究竟哪個品牌更好用&#xff1f; &#x…

這個春節,爽了

四次醫院 請了一周假&#xff0c;準備開始愉快的長假。 結果第一天小孩就發燒了&#xff0c;趕緊送醫院拿藥。回到家才發現&#xff0c;給醫生看的驗血報告是上一次的&#xff0c;那是好幾個月之前的。 但是藥已經吃了&#xff0c;這是吃錯藥了呀&#xff01;&#xff01; …

手機中有哪些逆向進化的功能

手機中有哪些逆向進化的功能&#xff1f;逆向進化是指明明很優秀的很方便的功能&#xff0c;卻因為成本或者其他工業原因莫名其妙地給取消了。 逆向進化1&#xff1a;可拆卸電池-變為不可拆卸電池。 智能手機為了追求輕薄等原因&#xff0c;所以移除了可拆卸電池功能。將電池…

GoLand 相關

goland 下載依賴 go mod tidy&#xff1a;保持依賴整潔 go mod tidy 命令的作用是清理未使用的依賴&#xff0c;并更新 go.mod 以及 go.sum 文件。 go mod tidy 和 go mod vendor 兩個命令是維護項目依賴不可或缺的工具。go mod tidy 確保了項目的 go.mod 文件精簡且準確&…

ubuntu20.04安裝實時內核補丁PREEMPT_RT

參考&#xff1a; Ubuntu 18.04安裝 RT-PREEMPT 實時內核及補丁【過程記錄】_ubuntu18.04 preempt rt linux 5.6.19-CSDN博客 https://github.com/UniversalRobots/Universal_Robots_ROS_Driver/blob/master/ur_robot_driver/doc/real_time.md當前內核&#xff1a;5.15.0-94-ge…

1.deeplabv3+網絡結構及原理

這里的網絡結構及原理可以看這篇博客&#xff0c;DeepLabV3: 在DeepLabV3基礎上引入了Decoder_matlab deeplabv3resnet101-CSDN博客該博客翻譯原論文解釋得很清楚。 一、引言 語義分割的目標是為圖像中的每個像素分配語義標簽。在這項研究中&#xff0c;考慮了兩種類型的神經網…

Vue計算屬性computed()

1. 計算屬性定義 獲取計算屬性值 <div>{{ 計算屬性名稱}}</div>創建計算屬性 let 定義的屬性ref/reactive....let 計算屬性名稱 computed(() > {//這里寫函數式,函數式里面包含定義屬性//只有這個包含的定義屬性被修改時才出發此函數式//通過計算屬性名稱co…

docker:Haoop集群

系列文章目錄 docker&#xff1a;環境安裝 docker:Web遷移 docker:Haoop集群 文章目錄 系列文章目錄前言一、宿主機選擇二、環境準備1.前置技術2.網絡環境1. docker網卡2. 分配IP 三、容器互聯三、Jdk和Hadoop安裝四、分發腳本五、啟動Hadoop總結 前言 年前學習了docker的相關…

ubuntu18 環境安裝

1. ubuntu18 環境安裝 1. ubuntu18 環境安裝 1.1. default language1.2. sougou shurufa1.3. cmake-last1.4. audio-recorder1.5. sources.list切換清華源1.6. oh my zsh1.7. weixin1.8. bcompare1.9. wireshark1.10. 其他問題 1.1. default language ubuntu 修改系統默認語…

https://registry.npm.taobao.org淘寶npm鏡像倉庫地址更新

在工作中有遇見獲取淘寶的npm鏡像存在問題&#xff0c;圖示如下的報錯&#xff1a; 根據報錯的內容是說 https://registry.npm.taobao.org地址訪問失敗了&#xff0c;然后通過排查發現淘寶的npm鏡像倉庫地址有更新了。需要使用最新的地址 舊的淘寶鏡像倉庫&#xff1a;https://…

數據結構2月19日

題目&#xff1a;順序表作業 代碼&#xff1a; 功能區&#xff1a; #include <stdio.h>#include <stdlib.h>#include "./d2191.h"SeqList* create_seqList(){SeqList* list (SeqList*)malloc(sizeof(SeqList));if(NULL list){return NULL;}list->p…

Linux系列講解 —— 【Vim編輯器】在Ubuntu18.04中安裝新版Vim

平時用的電腦系統是Ubuntu18.04&#xff0c;使用apt安裝VIM的默認版本是8.0。如果想要安裝新版的Vim編輯器&#xff0c;只能下載Vim源碼后進行編譯安裝。 目錄 1. 下載Vim源碼2. 編譯3. 安裝4. 遇到的問題4.1 打開vim后&#xff0c;文本開頭有亂碼現象。4.2 在Vim編輯器中&…

JS常見問題

文章目錄 如何判斷是數組 如何判斷是數組 Array.isArray console.log(Array.isArray(arr))instanceof&#xff08;instanceof 運算符用于驗證構造函數的 prototype 屬性是否出現在對象的原型鏈中的任意位置&#xff09; console.log(arr1 instanceof Array)constructor&#x…