防盗链
举个例子。我们平时在网上看到图片,觉得不错,想要复制地址。有的复制地址后我们可以拿来用,但是有的,就算是复制地址,用到我们自己的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的一个很好的综合练习。