【XSS】對抗蠕蟲 —— 如何讓按鈕不被 JS 自動點選
前言
XSS 自動點按鈕有什麼危害?
在社交網路裡,很多操作都是通過點選按鈕發起的,例如發表留言。假如留言系統有 XSS,使用者中招後除了基本攻擊外,還能進行傳播 —— XSS 自動填入留言內容,並模擬點擊發表按鈕,於是就能釋出帶有惡意程式碼的留言。好友看了中招後,又傳播給他們的好友。。。從而形成蠕蟲擴散。
那麼有沒有一種機制,讓「發表留言」必須通過使用者的「真實點選」按鈕才能完成,而無法通過指令碼自動實現?這樣就能減緩蠕蟲傳播速度了。
實現
這個想法聽起來好像不可行:如果發表留言需要帶上使用者行為資訊,那麼 XSS 完全可以偽造一份行為資料,後端根本無法識別。
除非,使用者在點選按鈕時會產生一個「特殊資料」,讓後端校驗它。
但是,XSS 也可以直接呼叫按鈕元素的 click 方法,這樣效果和使用者點選仍然一樣。後端仍無法識別是「指令碼點的」還是「使用者點的」。
這麼看來,我們只能保護好這個「按鈕元素」,讓它沒法被 XSS 訪問到。例如,把按鈕放到一個 不同源的 iframe 裡,這樣就和 XSS 所在的環境隔離了!
不過,這樣還不夠。假如 XSS 破解了這個「特殊資料」的生成規則,那麼即可自己偽造一個,然後直接呼叫 HTTP 介面發表留言。所以,我們得找一個不可偽造的硬標識。
事實上,有個很簡單的辦法:我們乾脆讓 HTTP 請求也通過 iframe 傳送。這樣,後端通過 referer 即可檢測請求是否為 iframe 發起的。畢竟,XSS 是無法偽造 referer 的!
演示
注意:這個案例不是看能不能注入 XSS,而是看能不能通過當前頁面的 JS 自動發留言!
另外,通過第三方伺服器發表是不算的。這裡為簡單,省略了登入態;真實場合下,會話 Cookie 是 HttpOnly 的,無法被 JS 獲取到,也就無法讓第三方伺服器代替發表。
細節:
使用者載入
safebutton.js
,引入SafeButton
類使用者例項化
SafeButton
物件 A,創建出一個不同源的 iframe 作為按鈕介面使用者點選 iframe 按鈕後,內部變數 S 置為 true,同時將點選訊息告知主頁面(postMessage)
主頁面收到訊息後,讓 A 產生
onclick
使用者將 HTTP 請求資料,通過 A 的
send
方法扔給 iframeiframe 校驗內部變數 S:若為 true,則將資料通過 AJAX 傳送;否則放棄
伺服器校驗 referer:若為 iframe 的地址,則繼續業務邏輯;否則放棄
iframe 收到 AJAX 返回後,將結果扔給主頁面
A 產生
onreceive
事件,其中包含 HTTP 返回結果
其中 No.6 的步驟最為關鍵。正是這一步,使得未經使用者點選,XSS 強制扔給 iframe 的訊息變得無效!
缺陷
當然,這個方案阻擋不了點選劫持 —— XSS 可以把 iframe 元素放大至整個頁面,並設定全透明。
這樣使用者只要在頁面的任何位置點一下,iframe 的 S 狀態就變成 true 了,於是就能繞過 No.6。
結尾
當然,安全防禦有勝於無。並且該方案的改造成本也不是很大,後端只是增加一個 referer 判斷而已;前端也只需改造個別按鈕,例如發帖按鈕,像點贊這種按鈕就沒必要保護了。
相關推薦
【XSS】對抗蠕蟲 —— 如何讓按鈕不被 JS 自動點選
前言 XSS 自動點按鈕有什麼危害? 在社交網路裡,很多操作都是通過點選按鈕發起的,例如發表留言。假如留言系統有 XSS,使用者中招後除了基本攻擊外,還能進行傳播 —— XSS 自動填入留言內容,並模擬點擊發表按鈕,於是就能釋出帶有惡意程式碼的留言。好友看了中招後,又傳播給他們的好友。。。從而形成蠕蟲擴散。
android 如何讓通知不被清除或者點選後不消失
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
【記錄】長按listview彈出刪除選項,點選刪除記錄刪除
1.方法主要程式碼,留作以後檢視備用 /* yyd新增單擊長按彈出選單。 */ public void onclick_select() { lv.setOnItemLongClickListener(new OnItemLongClickListener() {
Angularjs中table中實現點選td中按鈕不觸發tr的點選事件
今天遇到個問題: 1、在table中,每一行有個checkbox,tr上設定了ng-click; 2、每一行最後又有一個按鈕【詳情】,按鈕使用ui-sref設定了點選事件; 3、現在出現的問題是:點選【詳情】按鈕,同樣會觸發ng-click事件,即將複選框checkbox勾
android 如何讓通知不被清除或者點擊後不消失
roi 智能 tails androi edit 教程 基礎 edi http APP發送通知後,點擊clear按鈕,如何讓通知不被清除?或者點擊通知後,通知不消失? [Solution] APP發送通知時,通知需要添加flag: notification.flag
【轉載】MINI2440 TD35 P35觸控式螢幕不能使用? 讓我們來把一線觸控改四線觸控
本文獻給百問網www.100ask.org/bbs/forum.php,並真摯感謝韋東山老師。 很多像我一樣的嵌入式新手在使用mini2440學習觸控的時候估計都會遇到和我一樣的問題,那就是無論自己怎麼對照手冊反覆檢查暫存器的配置,或者照著視訊一個字母一個字母的
【XSS】之錨點
eval 源碼 div rip function 函數 settime cati ash 今天P師傅發了一個XSS鏈接,讓利用一下,源碼如下 <script type="text/javascript"> var x=location.hash; funct
【轉】如果有人讓你推薦Python技術書,請讓他看這個列表
實現 的人 arr word 練習 block ati -c swa 入門級 《Head First Python》+ 入門級 + 微信49票 + 豆瓣評分 9.5 推薦語: 66:淺顯易懂,編排的順序特別,有大量插圖、對話,不感覺枯燥 古心:通熟易懂,配有大量の圖片,不
【精華】PHP網站驗證碼不顯示的終結解決方案
brief 重新 pad enter 批量 list 展開 href lis PHP網站驗證碼不顯示,這個是個很基礎的PHP問題了,不過有點時候會比較讓開發者比較頭疼了。很多解決方案僅僅考慮到gd2,卻忽略了另外一個很重要的因素了,相信在了解本教程之後,驗證碼不顯示
【BZOJ】4032: [HEOI2015]最短不公共子串(LibreOJ #2123)
後綴 blog clas 字母 小寫 算法 存在 識別 題意 【題意】給兩個小寫字母串A,B,請你計算: (1) A的一個最短的子串,它不是B的子串 (2) A的一個最短的子串,它不是B的子序列 (3) A的一個最短的子序列,它不是B的子串 (4) A的一個最短的子序列,它
【轉】APIJSON,讓接口見鬼去吧!
line 介紹 equal 去除 lin lse except 探討 bsp 我: APIJSON,讓接口和文檔見鬼去吧! https://github.com/TommyLemon/APIJSON 服務端: 什麽鬼? 客戶端: APIJSON是啥? 我: APIJSON
【git】倉庫目錄下文件不加入版本控制
sdn -s info 技術分享 blog 詳細 .net bubuko 路徑 如果文件未做過提交操作,在文件所在目錄或上級目錄新建.gitignore文本文件,將文件的相對路徑寫入,再將該文本文件提交,則目標文件將被git忽略。 補一個gitignore文件書寫規範
【轉】總有一些你不知道web前端移動端知識
1.meta標籤 <meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no"/> 移動端加上這個標籤才是真正的自適應,不加的話,假如你把一個980px寬度(手機端常
【Python】pop與迭代不能共用
l = [0,1,5,3,2,7,6] for i in range(len(l)): print(i) if l[i]>3: l.pop(i) d=dict() for i in range(10): d[i] = i i=0 for k,
【教程】使用S3fs讓KEC雲主機直接掛載KS3 金山雲物件儲存bucket
S3fs是一款基於FUSE的檔案系統介面卡,通過S3fs能夠使物件儲存直接掛載到雲平臺虛擬機器,如雲硬碟一般使用,非常的方便。本教程教你如何在Linux系統上使用S3fs 對於Ubuntu 14.04,執行: sudo apt-get install automake autotools
【Ansible】3個讓Ansible效能飛起的簡單優化方案!
現狀: 在使用 Ansible 的過程中,當管理的伺服器數量增加時,不得不面對一個無法避免的問題執行效率慢,這裡列出一些解決方案。 一、gathering facts優化前的準備—收集資料 在做效能優化之前首先需要做的是收集一些統計資料,這樣才能為後面做的效能優化提供資
【轉】手機鎖屏收不到訊息推送解決方案
問題描述 部分 Android 手機系統在黑屏待機後自動清理後臺執行的軟體,這樣影響了應用正常接收新的訊息,需要將應用設定為後臺執行應用。各類機型的設定說明如下: 華為 Mate9 手機設定說明 華為榮耀 6Plus 手機設定說明 華為麥芒手機設定說明 OPPO 手機設
【原始碼】凸優化問題的不精確逼近梯度演算法的收斂速度分析
凸優化問題的不精確逼近梯度演算法的收斂速度分析 我們考慮利用逼近梯度法優化光滑凸函式和非光滑凸函式之和的問題,其中在光滑項的梯度或非光滑項的逼近運算元的計算中存在誤差。 We consider the problem of optimizing thesum
【探究】Python可變型別和不可變型別ID的變化
# 不可變型別 print("#"*50) print("不可變型別:") print("元組測試:") tuple_01 = (123, 456) print("tuple_01的資料為:【%s】
【轉載】Unity2018.2.9打不開VS2017,Unity開啟VS2017異常,並且有時候最後開啟的是Mono的解決方案
基於現在很多Unity工程師都是用VS寫程式碼除錯,現在分享下。 1.下載安裝Unity,下載安裝VS2017,下載安裝Visual Studio Tools For Unity2017 2.開啟Unity,選擇Edit→Preferences→Enternal