親,你的防盜鏈鑰匙,在我手上

爲何要搞個防盜鏈,難道怕自行車被偷嗎?如今都共享了,還擔憂什麼呢!html

防盜鏈,就是防你盜用個人連接。你在你的網站上引用了個人資源(圖片,音頻),你跑起來卻是沒什麼事,可是會浪費個人流量,資源被引用的多了起來,我這邊的服務器可能就扛不住掛了,你說這是多麼悲哀的事情!windows

通常狀況下以圖片防盜鏈居多,咱們也來看看圖片防盜鏈是如何作出來的bash

圖片防盜鏈

先來看個圖,這個圖是我在本地啓了一個服務後,分別加載了百度和360搜索兩個網站的圖片連接,對應防盜鏈下的樣子(說好的美少女呢) 服務器

百度的作法是用另一張圖片替換了,而360搜索的作法更粗暴,直接出現了裂圖,訪問403直接給Forbidden了

這就是所謂的圖片防盜鏈了,畢竟看到這樣的圖,你們也沒了興致,和以前想要的圖片差距太大,也就不必再保留了網站

那麼關鍵部分來了,圖片防盜鏈是如何作到的呢?且看下圖 ui

圖中所示,在請求頭中有 Host(請求的主機)和 Referer(來源)兩個參數,之因此會造成防盜鏈,那是由於Host和referer所對應的值不相同形成的

下面咱們就直接來實踐一下,作一個圖片防盜鏈,上菜 url

該圖爲整個文件夾目錄結構,下面參考該目錄結構來作,繼續來擼

// js部分
const fs = require('fs');
const path = require('path');
const http = require('http');
const url = require('url');
const getHostName = function (str) {
    let { hostname } = url.parse(str);
    return hostname;
};

http.createServer((req, res) => {
    let refer = req.headers['referer'] || req.headers['referrer'];  // 請求頭都是小寫的
    // 先看一下refer的值,去和host的值做對比,不相等就須要防盜鏈了  
    // 要讀取文件 返回給客戶端
    let { pathname } = url.parse(req.url);
    let src = path.join(__dirname, 'public', '.' + pathname);
    // src表明我要找的文件
    
    fs.stat(src, err => {   // 先判斷文件存不存在
        if (!err) {
            if (refer) {    // 不是全部圖片都有來源
                let referHost = getHostName(refer);
                let host = req.headers['host'].split(':')[0];
                
                if (referHost !== host) {
                    // 防盜鏈
                    fs.createReadStream(path.join(__dirname, 'public', './1.jpg')).pipe(res);
                } else {
                    // 正常顯示,若是路徑存在,能夠正常顯示直接返回
                    fs.createReadStream(src).pipe(res);
                }
            } else {
                // 正常顯示,若是路徑存在,能夠正常顯示直接返回
                fs.createReadStream(src).pipe(res);
            }
        } else {
            res.end('end');
        }
    });
    
}).listen(8888);
複製代碼

經過以上不到40行的代碼就完成了圖片防盜鏈,想來也並無辣麼麻煩,利用請求頭來作的事情仍是蠻多的,先來看看防盜鏈的效果吧spa

<-- html部分 -->
<body>
    <img src="http://www.chenhd.me:8888/2.png" />
</body>
複製代碼

這裏咱們修改一下hosts文件,把127.0.0.1指定爲兩個不一樣的域名訪問3d

  1. 127.0.0.1 www.chenhd.me
  2. 127.0.0.1 www.chd.me

友情提示code

  • windows系統修改hosts文件地址爲C:\Windos\System32\drivers\etc下的hosts文件,拷貝hosts文件修改後替換便可
  • mac系統下較爲方便經過終端直接sudo vi /etc/hosts修改便可

因爲html部分咱們圖片引用的地址就是www.chenhd.me域名下的圖片,因此這種狀況屬於正常訪問,直接展現2.png圖片了,就是這麼酷

當修改域名爲www.chd.me的時候,再次訪問就發現已經替換爲防盜鏈圖片1.jpg了,看以下效果
以上內容就實現瞭如何作一個圖片防盜鏈,防止別人使用你的資源,固然不只僅是圖片防盜鏈,音頻,視頻等也能夠根據此方法實現,以後你們也能夠在工做中嘗試嘗試

好了,今天的分享就到這裏了,感謝你們收看了

相關文章
相關標籤/搜索