必威体育Betway必威体育官网
当前位置:首页 > IT技术

HTTP之防盗链

时间:2019-07-21 03:10:00来源:IT技术作者:seo实验室小编阅读:77次「手机版」
 

防盗链

很多时候别人直接把我们的网站资源拿去在他们网站展示,但是消费的是我们的流量,为了解决这种问题,才会有防盗链这个思路

这里说的只是一个简单的概念,既使用host和reffer请求头做对比,简单的做一个处理,主要是用来熟悉http头

这里就是代码

// 防盗链实现
//  这里主要是通过reffer和host做对比,如果不是当前域,则给一张无用的图片
// 实现读取
let fs = require('fs')
let path = require('path')
let url = require('url')

/**
 * @description 解析host
 * @param {string} referStr 需要解析的refer字符串
 */
let getHostName = referStr => {
    let { hostname } = url.parse(referStr)
    return hostname
}
const server = require('http').createServer((req, res) => {
    // 拿到refer
    let refer = req.headers['referer'] || req.headers['referrer']

    // 判断是否又refer,有可能没有refer
    // 读取文件,返回给浏览器
    let { pathname } = url.parse(req.url)
    // p代表我们要找的文件
    let p = path.join(__dirname, 'public', '.' + pathname) // 这里是请求文件

    // 判断请求的文件有没有,没有的话直接结束,有的话在读取文件
    fs.stat(p, err => {
        if (!err) {
            if (refer) {
                // 先看一下refer的值,还要看图片的请求路径
                let referHostName = getHostName(refer)
                let host = req.headers['host'].split(':')[0]

                if (referHostName != host) {
                    // 防盗链
                    fs.createReadStream(path.join(__dirname, 'public', './timg.jpeg')).pipe(res)
                } else {
                    // 正常展示
                    fs.createReadStream(p).pipe(res)
                }
            } else {
                // 正常展示
                fs.createReadStream(p).pipe(res)
            }
        } else {
            res.end()
        }
    })
}).listen(5000)

// 当服务器错误时调用
server.on('ERROR', err => {
    if (err.code == 'EADDRINUSE') server.listen(++port)
    if (err) console.log(err)
})

// 当服务器关闭时调用
server.on('close', () => {
    console.log('服务端关闭')
})

白名单

很多时候我们做了限制以后,有需要给某些网站给引用的权限,就是白名单

// 添加白名单,可以允许某个站点访问当前站点
// 防盗链实现
//  这里主要是通过reffer和host做对比,如果不是当前域,则给一张无用的图片
// 实现读取
let fs = require('fs')
let path = require('path')
let url = require('url')

/**
 * @description 解析host
 * @param {string} referStr 需要解析的refer字符串
 */
let getHostName = referStr => {
    let { hostname } = url.parse(referStr)
    return hostname
}

// 白名单
let whiteList = ['www.demo.com']
const server = require('http').createServer((req, res) => {
    // 1拿到refer
    let refer = req.headers['referer'] || req.headers['referrer']

    // 判断是否又refer,有可能没有refer
    let { pathname } = url.parse(req.url)
    // p代表我们要找的文件
    let p = path.join(__dirname, 'public', '.' + pathname) // 这里是请求文件

    // 判断请求的文件有没有,没有的话直接结束,有的话在读取文件
    // 读取文件,返回给浏览器
    fs.stat(p, err => {
        if (!err) {
            if (refer) {
                // 先看一下refer的值,还要看图片的请求路径
                let referHostName = getHostName(refer)
                let host = req.headers['host'].split(':')[0]
                // 这里判断, referHostName != host
                // 白名单 加入判断 !whiteList.includes(referHostName)
                if (referHostName != host && !whiteList.includes(referHostName)) {
                    // 防盗链
                    fs.createReadStream(path.join(__dirname, 'public', './timg.jpeg')).pipe(res)
                } else {
                    // 正常展示
                    fs.createReadStream(p).pipe(res)
                }
            } else {
                // 正常展示
                fs.createReadStream(p).pipe(res)
            }
        } else {
            res.end()
        }
    })
}).listen(5000)
// 当服务器错误时调用
server.on('error', err => {
    if (err.code == 'EADDRINUSE') server.listen(++port)
    if (err) console.log(err)
})

// 当服务器关闭时调用
server.on('close', () => {
    console.log('服务端关闭')
})

最后的目录结构

// demo/public/index.html
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <title>防盗链</title>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" type="text/css" media="screen" href="main.css" />
  <script src="main.js"></script>
</head>
<body>
  <!-- 服务端不支持 ./ ../ 如果写了,相当于 ./ || ../  => / -->
  <img src="http://www.test.com:5000/xiaoxin.jpg" alt="test">
</body>
</html>

// 图片,如我的两张图片
// demo/public/xiaoxin.jpg
// timg.jpg //这个为用户调用我们的链接时候返回的图片

// server 脚本
// demo/server.js 内容就是上边的代码

// 测试 因为需要多个url地址,所以需要自己去host设置一下,才能实现,如我的设置
// 127.0.0.1 www.demo.com 
// 127.0.0.1 www.test.com

//做完上述设置,就可以在浏览器进行测试了

相关阅读

我来教你玩转iis防盗链 MYIIS-VIF超级防盗链

超级防盗链为何要防盗链? 您懂的,尊重知识产权,站长辛辛苦苦,熬更赶夜弄出来的资源,就别其他站点无情的采集走。。。着实心疼。顺带提

分享到:

栏目导航

推荐阅读

热门阅读