图片防盗链 - 知识扫盲

什么是图片防盗链

自己服务器上的图片,只想被自己信任的网站加载展示,其他域名禁止访问
即可以通过图片防盗链做到

原理

  • 从一个网站跳转,或者网页引用到某个资源文件时,HTTP请求中带有Referer表示来源网页的URL
  • 通过检查请求头中的Referer来判断来源网页的域名
  • 如果来源域名不在白名单内,则返回错误提示
  • 用浏览器直接访问图片地址是没有referer的

模拟实现

let http = require('http');
let url = require('url');
let path = require('path');
let fs = require('fs');
let root = path.join(__dirname, 'public');

// 移除端口号
function removePort(host) {
    return host.split(':')[0]
}
// 获取域名
function getHostName(urlAddr) {
    let {
        host
    } = url.parse(urlAddr);
    return removePort(host);
}
// 处理请求  获取请求头中的header中的referer
function request(req, res) {
    let refer = req.headers['referer'] || req.headers['referrer'];
    if (refer) {
        let referHost = getHostName(refer);
        let host = removePort(req.headers['host']);
        if (referHost != host) {
            sendForbidden(req, res);
        } else {
            serve(req, res);
        }
    } else {
        serve(req, res);
    }
}

function serve(req, res) {
    let {
        pathname
    } = url.parse(req.url);
    let filepath = path.join(root, pathname);
    console.log(req.url, filepath);

    fs.stat(filepath, (err, stat) => {
        if (err) {
            res.end('Not Found');
        } else {
            fs.createReadStream(filepath).pipe(res);
        }
    });
}

function sendForbidden(req, res) {
    res.end('防盗链');
}
let server = http.createServer();
server.on('request', request);
server.listen(8080);
//-H "referer: http://xxx.xxx.xxx.xxx"   http://localhost:8080/mv.jpg

你可能感兴趣的:(计算机网络总结,计算机网络)