亲,你的防盗链钥匙,在我手上

为何要搞个防盗链,难道怕自行车被偷吗?如今都共享了,还担忧什么呢!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了,看以下效果
以上内容就实现了如何作一个图片防盗链,防止别人使用你的资源,固然不只仅是图片防盗链,音频,视频等也能够根据此方法实现,以后你们也能够在工做中尝试尝试

好了,今天的分享就到这里了,感谢你们收看了

相关文章
相关标签/搜索