一文带你搞懂防盗链

防盗链

举个例子。我们平时在网上看到图片,觉得不错,想要复制地址。有的复制地址后我们可以拿来用,但是有的,就算是复制地址,用到我们自己的img上,还是没效果。

原因是,有的图片所在服务有自己的防盗链。

防盗链的作用:防止外部网站盗用本网站资源。(别人的域名没办法访问服务资源)

为什么要有防盗链?从全局看,有的网站资源比较稀缺,或者是请求的人多了,网站压力会很大,所以设置了防盗链,是对资源的一种保护。

注意,这个静态资源只针对图片。

实现防盗链

关键:refer请求头。

实现功能:声明一个中间件,检测请求头中的refer是否为可访问域名。

这里,在自己的电脑上演示,自己的电脑可以有两个域名,一个是127.0.0.1,还有一个是localhost。

现在实现一个简单的demo,挂载一个静态资源,要求能在127.0.0.1这个域名访问,不能用localhost这个域名访问。

代码如下:

const express = require('express')

const app = express()


app.use((req, res, next) => {
    
    
    //检测请求头中的referer是否为127.0.0.1
    //获取referer
    let referer = req.get('referer')
    if (referer) {
    
    
        let url = new URL(referer)
        let hostname = url.hostname;
        console.log(hostname)
        if(hostname !== '127.0.0.1') {
    
    
            res.status(404).send('<h1>404 not find</h1>');
        }
    }
    next()
})

//用内置中间件挂载静态资源
app.use(express.static(__dirname + '/public'))

app.get('/home', (req, res) => {
    
    
    res.end('home')
})

app.listen(3000, () => {
    
    
    console.log('已在服务端运行...')
})

最后达到的效果:在这里插入图片描述
在这里插入图片描述

现在来讲一下原理:

首先要知道的是,referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器该网页是从哪个页面链接过来的,服务器因此可以获得一些信息用于处理。在本机上就是:127.0.0.1:3000; localhost:3000。

当我们获取referer后,我们可以获取域名。hostname用于获取域名。获取域名后,可以写一个简单的判断,如果域名是127.0.0.1就可以显示资源否则图片请求不到。

这里要说一个细节,细节就是,只有静态资源里面 有图片才可以正常获取referer。

总结

这个例子很好的使用了nodejs的中间件。也是nodejs中的express的一个很好的综合练习。

猜你喜欢

转载自blog.csdn.net/zxdznyy/article/details/130983308