成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

以Referer方案寫一個(gè)圖片防盜鏈服務(wù)并實(shí)現(xiàn)網(wǎng)頁端"破解"

sPeng / 2237人閱讀

摘要:在同等安全級(jí)別的情況下,發(fā)送文件的源作為引用地址,但是在降級(jí)的情況下不會(huì)發(fā)送。

什么是盜鏈
資源不在自己服務(wù)器上, 而通過技術(shù)手段, 把資源放置到自己的網(wǎng)站中, 通過這種方法盜取他人的資源.
什么是Referer
Refererhttp請求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.ts
import 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

相關(guān)文章

  • 使用LeanCloud服務(wù)做一站式Chrome插件開發(fā)——Favorite Image

    摘要:云存儲(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) 對去...

    JohnLui 評(píng)論0 收藏0
  • 爬蟲問題總結(jié)

    摘要:編碼我們發(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...

    nanfeiyan 評(píng)論0 收藏0
  • PHP面試之二:高發(fā)與大數(shù)據(jù)

    摘要:三態(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ì) 防盜鏈...

    Ashin 評(píng)論0 收藏0
  • php偽造Referer請求反盜資源

    摘要:反盜鏈分類我們了解了盜鏈對源站的危害后,自然要通過一些手段來阻止這種行為維護(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)侵?..

    chenatu 評(píng)論0 收藏0
  • php偽造Referer請求反盜資源

    摘要:反盜鏈分類我們了解了盜鏈對源站的危害后,自然要通過一些手段來阻止這種行為維護(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)侵?..

    Drinkey 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<