1. 程式人生 > >用Express做一個圖片簡易防盜鏈

用Express做一個圖片簡易防盜鏈

最近做的一個主管安排的專案,給一個系統多增加一套前端模板,這個本身不難,由於演算法那邊不能提供資料,我隨便複製的網上圖片連結,發現有些圖片不能正常顯示,後來知道有些圖片加了“防盜鏈”,這讓我馬上想到了以前遇到的http請求頭中的referer屬性,這個訊息頭記錄了本網站的一些資源請求是來自哪個網站,如果利用這個referer的判斷,就可以實現過濾。

程式碼:

var express = require('express');
var app = express();
var fs = require('fs');
// 設定模板路徑,預設為./views
// app.set('views', path.join('views'));
app.engine('html', require('ejs').renderFile);
app.set('view engine', 'html');

app.get('/public/*',
    function (req, res, next) {
        var referer = req.headers.referer;
        console.log(referer);
        if (referer && referer.indexOf('localhost1') <= 0) {
            try {
                fs.readFile("./views/no.png", function (err, data) {
                    console.log("no");
                    res.writeHead(200, {"Content-type": "image/jpg"});
                    console.log(err);
                    // console.log(data);
                    res.end(data);
                });
            } catch (err) {
                console.log(err);
            }
        } else {
            try {
                fs.readFile("./views/a.jpg", function (err, data) {
                    console.log("normal");
                    res.writeHead(200, {"Content-type": "image/jpg"});
                    // console.log(data);
                    res.end(data);
                });
            } catch (err) {
                console.log(err);
            }
        }
    });
app.get('/', function (req, res) {
    res.render('index', {helloWorld: 'hello,world'});
});

app.listen(3000, function () {
    console.log('app listen at 3000');
});

referer是一個網站中某個資源的請求才會帶的屬性,如果是直接訪問圖片的這個地址,是不帶referer的,所以
這裡寫圖片描述
這裡判斷的時候,先要判斷referer存在,再判斷是不是從某域發過來的請求,因為我們直接訪問地址的時候是想看到圖片結果的,只是一些網站引用我們的圖片連結時我們加以遮蔽。

還可以以中介軟體的形式:

var express = require('express');
var app = express();
var fs = require('fs');
// 設定模板路徑,預設為./views
// app.set('views', path.join('views'));
app.engine('html', require('ejs').renderFile);
app.set('view engine', 'html');

function sss (req, res, next) {
    var referer = req.headers.referer;
    console.log(referer);
    // console.log(referer.indexOf('localhost3'));
    if (referer && referer.indexOf('localhost1') >= 0) {
        next();
    } else {
        // console.log(res);
        console.log(1);
        // res.state(500).send('盜鏈圖片來自:<a href="xxxxx"></a>');
        res.send('盜鏈圖片來自:<a href="xxxxx"></a>');
        return false;
    }
}

app.get('/public/*',
    sss,
    function (req,res,next) {
    console.log(234234);
        try {
            fs.readFile("./views/a.jpg", function (err, data) {
                res.writeHead(200, {"Content-type": "image/jpg"});
                console.log(err);
                // console.log(data);
                res.end(data);
            });
        }catch (err) {
            console.log(err);
        }
});
app.get('/', function(req, res) {
    console.log(10);
    res.render('index', { helloWorld: 'hello,world' });
});

app.listen(3000, function() {
    console.log('app listen at 3000');
});

當然破解這種寫法的防盜鏈也很簡單,用中間伺服器偽造訊息頭就行了。

相關推薦

Express一個圖片簡易防盜

最近做的一個主管安排的專案,給一個系統多增加一套前端模板,這個本身不難,由於演算法那邊不能提供資料,我隨便複製的網上圖片連結,發現有些圖片不能正常顯示,後來知道有些圖片加了“防盜鏈”,這讓我馬上想到了以前遇到的http請求頭中的referer屬性,這個訊息頭記錄了本網站的一些資源請求是來自哪個網站,如果利用這

星期四、星期五、星期一—GUI一個簡易的交易系統

his 換行 巧克力 cal show .get ner 文本域 array 1、登錄界面 package org.eclipse.wb.swing; //登錄界面 import java.awt.BorderLayout;import java.awt.EventQue

Python日記——Django一個簡易的知乎日報API

現在我主要教大家如何去實戰,做一個簡易的知乎日報API 首先你要熟悉django的基本用法,會寫模型,會寫檢視函式,會配置url 1.配置字元編碼 因為我們等一下要使用中文,所以要先設好字元編碼 在settings.py裡將LANGUAGE_CODE

WPF一個簡易瀏覽器

微軟的WPF(Windows Presentation Foundation)是目前Windows平臺上最好用的圖形介面框架了。如果想在Windows平臺上編寫圖形介面程式,而且沒有跨平臺且效能需求比較高,而且對C#語言比較熟悉,那麼WPF就是最適合你的了。

怎麽cookie一個選項卡?

eight splay i++ 作用 code round tab 多網站 個性化 什麽是cookie? Cookies雖然一般都以英文名呈現,但是它還是有一個可愛的中文名“小甜餅”。Cookies是指服務器暫存放在你的電腦裏的txt格式的文本文件資料,主要用

繞過010Editor網絡驗證(python一個仿真http server真容易,就幾行代碼)

headers redirect 如果 table 本地 align cnn 破解版 resp 010Editor是一款非常強大的十六進制編輯器,尤其是它的模板功能在分析文件格式時相當好用!網上現在也有不少010Editor的破解版,如果沒錢或者舍不得花錢買授權的話,去官方

微信圖片防盜 不太成熟的解決方式 僅供參考

clas ava order 解決 () this mage 比較 mat $("#imgDiv img").each(function () { var img = $(this); var img_src = img.attr("src") +

vue一個酷炫的menu

方法 tar ges enter 導入 count https 簡單 ren 寫在前面 最近看到一個非常酷炫的menu插件,一直想把它鼓搗成vue形式,誰讓我是vue的死灰粉呢,如果這都不算愛??。??開個小玩耍,我們一起來探索黑魔法吧。觀看本教程的讀者需要

【python基礎】字典一個小型的查詢數據庫

import oot 字符 odin 參數錯誤 err 輸出 put 異常 例子來源於《python基礎教程》第三版,57p 該例子主要是使用字典的方式,實現一個小型的數據庫,通過查詢字典的鍵值來獲取用戶的信息。 本人修改了部分代碼。 #!/usr/bin/python3

懶人動手,python一個基礎翻譯重新命名器(破解百度翻譯反爬手段)

想法: 在做開發的時候,經常需要命名各種變數,方法/函式,類,包,庫等。 走一遍流程就是:想好要起的名字,比如“非常帥氣”; 然後上翻譯網站,比如百度翻譯,有道翻譯; 將中文輸入並讓其翻譯成英文,此時就得出一個“very handsome”的單詞; 根據駝峰命名法,我們最後需要得

簡單的一個圖片上傳預覽(web前端)

chrom 預覽 web前端 console fine 分享圖片 fire title right 轉載:點擊查看原文 在做web項目很多的時候圖片都是避免不了的,所以操作圖片就成了一個相對比較棘手的問題,其實也不是說很麻煩,只是說上傳然後直接預覽的過

Vue 一個簡單的購物app

有意思 應用程序 其中 ins com 簡單的 node.js 引入 大神 前言 最近在學習Vue的使用。看了官方文檔之後,感覺挺有意思的。於是著手做了一個簡單的購物app。這是我第一次在這個網站上寫分享,如有不當之處,請多多指教。 一整個項目寫下來,最大的感覺就是組件式開

java一個簡單的打字遊戲

Java也是可以做桌面程式的。只不過需要執行在裝有JDK的電腦環境上,所以應用不是很廣泛,但是用來提高自身的程式碼邏輯還是可以的!偶有一天看到金山的打字通,就想起何不做個簡單的打字遊戲用來練練手。於是就有了下文 首先建一個類MyTyping,只有main方法   執行main方法

HTML5一個個人網站,此文僅展示個人主頁介面。內附原始碼下載地址

html5 ,用css去修飾自己的個人主頁 程式碼如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitio

列表一個登入系統 功能實現:註冊與登入系統

list1=[]# 儲存使用者名稱 list2=[] #儲存密碼 while True: print('歡迎來到登入頁面') print('1:登入\n2:註冊\n3:退出') xz = int(input('請選擇:')) if xz ==

發現電腦上還裝著liteide,就golang一個TCP通訊測試

1、參考https://www.cnblogs.com/yin5th/p/9274495.html server端 main.go package main import ( "fmt" "net" ) func main() { // simple t

[Python] python一個遊戲輔助指令碼,完整思路

一、說明   簡述:本文將以4399小遊戲《寵物連連看經典版2》作為測試案例,通過識別小圖示,模擬滑鼠點選,快速完成配對。對於有興趣學習遊戲指令碼的同學有一定的幫助。   執行環境:Win10/Python3.5。   主要模組:win32gui(識別視窗、視窗置頂等操作)、PIL(螢幕截圖)、nump

OpenPose一個運動量測量器

通過openpose獲得肢體關鍵點的位置資訊,利用脖子位置作為中心點求得相對位置,然後用左肩到右肩距離進行歸一化,將經過上述處理後的位置作為輸出。利用攝像頭獲得每一幀的上述輸出,相減得到各個關節的移

Java一個及時翻譯工具

                     平時看英文文件或者查詢資料的時候,遇到了不懂的單詞,就要去百度,然後就會很麻煩。於是就想到用Java寫一個及時翻譯的小工具!預期的實現效果: 雙擊選中一個單詞,按下Ctrl+C進行復制 然後馬上顯示出對應單詞的中文翻譯首先基本思路是這樣的:    首先獲取系統剪下板的

java一個簡單的萬年曆

一個簡單的萬年曆製作 簡單介紹萬年曆的各功能實現: 1.首先鍵盤輸入查詢的年份和月份 Scanner sc = new Scanner(System.in); System.ou