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

最近作的一個主管安排的項目,給一個系統多增長一套前端模板,這個自己不難,因爲算法那邊不能提供數據,我隨便複製的網上圖片連接,發現有些圖片不能正常顯示,後來知道有些圖片加了「防盜鏈」,這讓我立刻想到了之前遇到的http請求頭中的referer屬性,這個消息頭記錄了本網站的一些資源請求是來自哪一個網站,若是利用這個referer的判斷,就能夠實現過濾。html

代碼:前端

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存在,再判斷是否是從某域發過來的請求,由於咱們直接訪問地址的時候是想看到圖片結果的,只是一些網站引用咱們的圖片連接時咱們加以屏蔽。算法

還能夠以中間件的形式:express

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');
});

固然破解這種寫法的防盜鏈也很簡單,用中間服務器僞造消息頭就好了。服務器

相關文章
相關標籤/搜索