摘要:在同等安全級別的情況下,發送文件的源作為引用地址,但是在降級的情況下不會發送。
什么是盜鏈
資源不在自己服務器上, 而通過技術手段, 把資源放置到自己的網站中, 通過這種方法盜取他人的資源.什么是Referer
Referer是http請求header的一部分, 當瀏覽器(或者模擬瀏覽器行為)向web服務器發送請求的時候,頭信息里有包含 Referer. 它表示當前接口的訪問來源. Referer的正確英語拼法是referrer. 由于早期http規范的拼寫錯誤, 為了保持向后兼容就將錯就錯了. 其它網絡技術的規范企圖修正此問題, 使用正確拼法, 所以目前拼法不統一.為什么要設置防盜鏈
防爬蟲(流量暴漲, 服務提供者卻是受害者)
安全
如何設置防盜鏈此處以基于express的二次開發框架nestjs起一個小demo
你完全可以用token驗證等方法去實現更嚴格的防盜鏈
...(如何添加路由等等就不說了, 有興趣直接去看看我的代碼, 直接跳到驗證器的路由代碼去)
routers/doorChain/controller.tsimport express from "express"; import { Get, Headers, Res, Controller } from "@nestjs/common"; import { DoorChainService } from "./service"; @Controller("door-chain") export class DoorChainController { constructor(private readonly doorChainService: DoorChainService) {} @Get() root(@Headers("referer") referer: string, @Res() res: express.Response) { return this.doorChainService.root(referer, res); } }routers/doorChain/service.ts
import * as url from "url"; import * as path from "path"; import express from "express"; import { Injectable } from "@nestjs/common"; import logger from "utils/logger"; @Injectable() export class DoorChainService { root(referer: string, res: express.Response) { let imageName = "break.png"; if (!referer) { imageName = "yellow.png"; } else { try { const refererParsed = url.parse(referer); if (refererParsed.host === "localhost:8080") { imageName = "yellow.png"; } } catch (err) {} } const imagePath = path.resolve(__dirname, `./../../assets/${imageName}`); res.sendFile(imagePath, null, err => { if (err) { logger.error(err); res.status(404).end(); } else { logger.info(`Sent: ${imagePath}`); } }); } }
主要的邏輯代碼就那么幾行!
驗證的基本思路:
當referer為空時, 返回正確的圖
當referer不為空, 且host命中我的目標網站時, 返回正確的圖
當referer不為空, 但host未能命中我的目標網站時, 返回錯誤的圖
啟動服務, 訪問http://localhost:3333/door-chain, 返回正確的圖!!!
如何去掉訪問限制這次我們僅討論怎么在網頁端去掉訪問的限制, 另外還有七牛鏡像儲存, 或者把實現方案交由服務端處理等等都是可以的, 而且原理都是一樣, 這里不一一贅述.
以下簡述去掉header中的Referrer的兩種方法:
添加name為referrer, content為never(whatwg標準, 兼容性相對較好)或no-referrer(MDN標準)的meta標簽
策略名稱 | 屬性值(MDN標準) | 屬性值(whatwg標準) |
---|---|---|
No Referrer | no-referrer | never |
No Referrer When Downgrade | no-referrer-when-downgrade | default |
Origin Only | origin | - |
Origin When Cross-origin | origin-when-crossorigin | - |
Unsafe URL | unsafe-url | always |
無論選擇哪一個值, 都有一個缺點, 就是默認情況下全部資源(包括接口)都被處理了
對標簽添加ReferrerPolicy屬性
更精確的指定了某一個資源的referrer策略
相對以上的值列表, ReferrerPolicy在此基礎上擴展了三個可供選擇的值:
same-origin 對于同源的請求會發送引用地址,但是對于非同源請求則不發送引用地址信息。
strict-origin 在同等安全級別的情況下,發送文件的源作為引用地址(HTTPS->HTTPS),但是在降級的情況下不會發送 (HTTPS->HTTP)。
strict-origin-when-cross-origin 對于同源的請求,會發送完整的URL作為引用地址;在同等安全級別的情況下,發送文件的源作為引用地址(HTTPS->HTTPS);在降級的情況下不發送此首部 (HTTPS->HTTP)。
如果在純粹開發的角度上, 這個方式是接近完美的, 因為沒有污染到其他任何東西. 再來看看瀏覽器兼容性方面:
常規值的問題也不大. 新擴展的三個值的兼容性圖
有點不容樂觀啊!關于擴展img標簽屬性
在tsx中img標簽默認是不支持referrerPolicy的, 實現方案可以參考ts-react-webpack, 查看我是如何擴展的, 歡迎來踩!!!
當然了, 雖然常用的會是類似上述的方案, 總的來說, 這里只是防盜鏈知識體系中的鳳毛麟角, 仍有待探索.
此外還有referrer-killer等等的項目可以參閱
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/108135.html
摘要:云存儲問題,帳號系統,多端同步最開始只想做瀏覽器本地的存儲,使用提供的存在本地就。具體解決方案云存儲及帳號系統使用提供的存儲服務解決。 0. 目錄 要開發的是什么項目 1.1 想法開端 1.2 應該有什么功能? 開發需要解決的核心問題 具體解決方案 3.1 帳號系統 3.2 存儲服務 3.3 使用`LeanEngine`做反防盜鏈中轉接口 3.4 Chrome 插件實現 對去...
摘要:三態分別是就緒運行阻塞進程的五態模型在三態的基礎上發展而來新建態運行態終止態就緒態等待態線程稱之為輕量級的進程,程序執行流的最小單元。一個進程下有多個線程來完成不同的工作稱之為多線程。 web資源防盜鏈 盜鏈是什么? 為什么要防? 在自己頁面上顯示一些不是自己服務器的資源(圖片、音頻、視頻、css、js等)由于別人盜鏈你的資源會加重你的服務器負擔,所以我們需要防止可能會影響統計 防盜鏈...
摘要:反盜鏈分類我們了解了盜鏈對源站的危害后,自然要通過一些手段來阻止這種行為維護自己的利益。參考文章百科盜鏈防盜鏈偽造防盜鏈 有些產品為了防止自己的產品被盜鏈訪問,會采用反盜鏈措施,如封閉型生態的音樂網站和視頻網站,他們已經為了版權付費,自然不希望你免費使用他們的資源。但因為很多人專門研究盜鏈,因此我們也需要了解下盜鏈、反盜鏈和逃避反盜鏈的原理。 盜鏈 引用百度百科對盜鏈的定義: 盜鏈是指...
摘要:反盜鏈分類我們了解了盜鏈對源站的危害后,自然要通過一些手段來阻止這種行為維護自己的利益。參考文章百科盜鏈防盜鏈偽造防盜鏈 有些產品為了防止自己的產品被盜鏈訪問,會采用反盜鏈措施,如封閉型生態的音樂網站和視頻網站,他們已經為了版權付費,自然不希望你免費使用他們的資源。但因為很多人專門研究盜鏈,因此我們也需要了解下盜鏈、反盜鏈和逃避反盜鏈的原理。 盜鏈 引用百度百科對盜鏈的定義: 盜鏈是指...
閱讀 2628·2021-11-23 09:51
閱讀 2418·2021-09-30 09:48
閱讀 2044·2021-09-22 15:24
閱讀 1009·2021-09-06 15:02
閱讀 3303·2021-08-17 10:14
閱讀 1934·2021-07-30 18:50
閱讀 1980·2019-08-30 15:53
閱讀 3168·2019-08-29 18:43