摘要:在同等安全級(jí)別的情況下,發(fā)送文件的源作為引用地址,但是在降級(jí)的情況下不會(huì)發(fā)送。
什么是盜鏈
資源不在自己服務(wù)器上, 而通過技術(shù)手段, 把資源放置到自己的網(wǎng)站中, 通過這種方法盜取他人的資源.什么是Referer
Referer是http請求header的一部分, 當(dāng)瀏覽器(或者模擬瀏覽器行為)向web服務(wù)器發(fā)送請求的時(shí)候,頭信息里有包含 Referer. 它表示當(dāng)前接口的訪問來源. Referer的正確英語拼法是referrer. 由于早期http規(guī)范的拼寫錯(cuò)誤, 為了保持向后兼容就將錯(cuò)就錯(cuò)了. 其它網(wǎng)絡(luò)技術(shù)的規(guī)范企圖修正此問題, 使用正確拼法, 所以目前拼法不統(tǒng)一.為什么要設(shè)置防盜鏈
防爬蟲(流量暴漲, 服務(wù)提供者卻是受害者)
安全
如何設(shè)置防盜鏈此處以基于express的二次開發(fā)框架nestjs起一個(gè)小demo
你完全可以用token驗(yàn)證等方法去實(shí)現(xiàn)更嚴(yán)格的防盜鏈
...(如何添加路由等等就不說了, 有興趣直接去看看我的代碼, 直接跳到驗(yàn)證器的路由代碼去)
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}`); } }); } }
主要的邏輯代碼就那么幾行!
驗(yàn)證的基本思路:
當(dāng)referer為空時(shí), 返回正確的圖
當(dāng)referer不為空, 且host命中我的目標(biāo)網(wǎng)站時(shí), 返回正確的圖
當(dāng)referer不為空, 但host未能命中我的目標(biāo)網(wǎng)站時(shí), 返回錯(cuò)誤的圖
啟動(dòng)服務(wù), 訪問http://localhost:3333/door-chain, 返回正確的圖!!!
如何去掉訪問限制這次我們僅討論怎么在網(wǎng)頁端去掉訪問的限制, 另外還有七牛鏡像儲(chǔ)存, 或者把實(shí)現(xiàn)方案交由服務(wù)端處理等等都是可以的, 而且原理都是一樣, 這里不一一贅述.
以下簡述去掉header中的Referrer的兩種方法:
添加name為referrer, content為never(whatwg標(biāo)準(zhǔn), 兼容性相對較好)或no-referrer(MDN標(biāo)準(zhǔn))的meta標(biāo)簽
策略名稱 | 屬性值(MDN標(biāo)準(zhǔn)) | 屬性值(whatwg標(biāo)準(zhǔn)) |
---|---|---|
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 |
無論選擇哪一個(gè)值, 都有一個(gè)缺點(diǎn), 就是默認(rèn)情況下全部資源(包括接口)都被處理了
對標(biāo)簽添加ReferrerPolicy屬性
更精確的指定了某一個(gè)資源的referrer策略
相對以上的值列表, ReferrerPolicy在此基礎(chǔ)上擴(kuò)展了三個(gè)可供選擇的值:
same-origin 對于同源的請求會(huì)發(fā)送引用地址,但是對于非同源請求則不發(fā)送引用地址信息。
strict-origin 在同等安全級(jí)別的情況下,發(fā)送文件的源作為引用地址(HTTPS->HTTPS),但是在降級(jí)的情況下不會(huì)發(fā)送 (HTTPS->HTTP)。
strict-origin-when-cross-origin 對于同源的請求,會(huì)發(fā)送完整的URL作為引用地址;在同等安全級(jí)別的情況下,發(fā)送文件的源作為引用地址(HTTPS->HTTPS);在降級(jí)的情況下不發(fā)送此首部 (HTTPS->HTTP)。
如果在純粹開發(fā)的角度上, 這個(gè)方式是接近完美的, 因?yàn)闆]有污染到其他任何東西. 再來看看瀏覽器兼容性方面:
常規(guī)值的問題也不大. 新擴(kuò)展的三個(gè)值的兼容性圖
有點(diǎn)不容樂觀啊!關(guān)于擴(kuò)展img標(biāo)簽屬性
在tsx中img標(biāo)簽?zāi)J(rèn)是不支持referrerPolicy的, 實(shí)現(xiàn)方案可以參考ts-react-webpack, 查看我是如何擴(kuò)展的, 歡迎來踩!!!
當(dāng)然了, 雖然常用的會(huì)是類似上述的方案, 總的來說, 這里只是防盜鏈知識(shí)體系中的鳳毛麟角, 仍有待探索.
此外還有referrer-killer等等的項(xiàng)目可以參閱
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/108135.html
摘要:云存儲(chǔ)問題,帳號(hào)系統(tǒng),多端同步最開始只想做瀏覽器本地的存儲(chǔ),使用提供的存在本地就。具體解決方案云存儲(chǔ)及帳號(hào)系統(tǒng)使用提供的存儲(chǔ)服務(wù)解決。 0. 目錄 要開發(fā)的是什么項(xiàng)目 1.1 想法開端 1.2 應(yīng)該有什么功能? 開發(fā)需要解決的核心問題 具體解決方案 3.1 帳號(hào)系統(tǒng) 3.2 存儲(chǔ)服務(wù) 3.3 使用`LeanEngine`做反防盜鏈中轉(zhuǎn)接口 3.4 Chrome 插件實(shí)現(xiàn) 對去...
摘要:編碼我們發(fā)現(xiàn),中有時(shí)候存在中文,這是就需要對進(jìn)行編碼??梢韵葘⒅形霓D(zhuǎn)換成編碼,然后使用方法對參數(shù)進(jìn)行編碼后傳遞。 本文檔對日常學(xué)習(xí)中用 python 做數(shù)據(jù)爬取時(shí)所遇到的一些問題做簡要記錄,以便日后查閱,部分問題可能因?yàn)檎J(rèn)識(shí)不到位會(huì)存在一些誤解,敬請告知,萬分感謝,共同進(jìn)步。 估算網(wǎng)站規(guī)模 該小節(jié)主要針對于整站爬取的情況。爬取整站之前,肯定是要先對一個(gè)網(wǎng)站的規(guī)模進(jìn)行估計(jì)。這是可以使用g...
摘要:三態(tài)分別是就緒運(yùn)行阻塞進(jìn)程的五態(tài)模型在三態(tài)的基礎(chǔ)上發(fā)展而來新建態(tài)運(yùn)行態(tài)終止態(tài)就緒態(tài)等待態(tài)線程稱之為輕量級(jí)的進(jìn)程,程序執(zhí)行流的最小單元。一個(gè)進(jìn)程下有多個(gè)線程來完成不同的工作稱之為多線程。 web資源防盜鏈 盜鏈?zhǔn)鞘裁矗?為什么要防? 在自己頁面上顯示一些不是自己服務(wù)器的資源(圖片、音頻、視頻、css、js等)由于別人盜鏈你的資源會(huì)加重你的服務(wù)器負(fù)擔(dān),所以我們需要防止可能會(huì)影響統(tǒng)計(jì) 防盜鏈...
摘要:反盜鏈分類我們了解了盜鏈對源站的危害后,自然要通過一些手段來阻止這種行為維護(hù)自己的利益。參考文章百科盜鏈防盜鏈偽造防盜鏈 有些產(chǎn)品為了防止自己的產(chǎn)品被盜鏈訪問,會(huì)采用反盜鏈措施,如封閉型生態(tài)的音樂網(wǎng)站和視頻網(wǎng)站,他們已經(jīng)為了版權(quán)付費(fèi),自然不希望你免費(fèi)使用他們的資源。但因?yàn)楹芏嗳藢iT研究盜鏈,因此我們也需要了解下盜鏈、反盜鏈和逃避反盜鏈的原理。 盜鏈 引用百度百科對盜鏈的定義: 盜鏈?zhǔn)侵?..
摘要:反盜鏈分類我們了解了盜鏈對源站的危害后,自然要通過一些手段來阻止這種行為維護(hù)自己的利益。參考文章百科盜鏈防盜鏈偽造防盜鏈 有些產(chǎn)品為了防止自己的產(chǎn)品被盜鏈訪問,會(huì)采用反盜鏈措施,如封閉型生態(tài)的音樂網(wǎng)站和視頻網(wǎng)站,他們已經(jīng)為了版權(quán)付費(fèi),自然不希望你免費(fèi)使用他們的資源。但因?yàn)楹芏嗳藢iT研究盜鏈,因此我們也需要了解下盜鏈、反盜鏈和逃避反盜鏈的原理。 盜鏈 引用百度百科對盜鏈的定義: 盜鏈?zhǔn)侵?..
閱讀 2669·2021-11-23 09:51
閱讀 2427·2021-09-30 09:48
閱讀 2057·2021-09-22 15:24
閱讀 1020·2021-09-06 15:02
閱讀 3320·2021-08-17 10:14
閱讀 1951·2021-07-30 18:50
閱讀 1990·2019-08-30 15:53
閱讀 3189·2019-08-29 18:43