Heim >Web-Frontend >js-Tutorial >nodejs implementiert die Blacklist-Middleware design_node.js

nodejs implementiert die Blacklist-Middleware design_node.js

WBOY
WBOYOriginal
2016-05-16 16:44:041599Durchsuche

Blacklist-Schema:

Code kopieren Der Code lautet wie folgt:

/**
 * Erstellt von YCXJ-wanglihui am 28.05.2014.
 */
'strikt verwenden';

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

//1. Vorübergehende Blockierung 2. Permanente Blockierung
var grade = {TEMP:1, FOREVER:2};

/**
* Blacklist
* @type {Schema}
*
* @param ip {String} Blacklist Ip
* @param createAt {Date} Erstellungszeit
* @param ExpireTime { Datum} Wenn es sich um eine vorübergehende Sperrung handelt, die Ablaufzeit der Sperrung
* @param prohibitionDegree {Number} Sperrstufe 1. Vorübergehende Sperrung 2. Permanente Sperrung
* @param reason {String} Sperrgrund
*/
var BlackList = new Schema({
ip:{
type: String,
index:true
},
createAt: {
Typ: Datum,
Standard: Date.now
},
Ablaufzeit:{
Typ: Datum
},
verbotener Grad:{
Typ: Zahl ,
default:degree.TEMP
},
reason:{
type: String,
default: 'Häufige Anfragen'
}
});

mongoose.model('BlackList', BlackList);

IP- und Übermittlungsdatensatzschema:

Code kopieren Der Code lautet wie folgt:

/**
 * Erstellt von YCXJ-wanglihui am 28.05.2014.
 */

'strikt verwenden';

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var ObjectId = Schema.ObjectId;

/**
* Erfassen Sie die Antworten und die IP der teilnehmenden Fragebögen
* @type {Schema}
*
* @param answerId {ObjectId} Antwort-ID
* @param createAt {Date} Erstellungszeit
* @param ip {String} Die IP der Person, die an der Antwort teilnimmt
*/
var IpAnswerLog = new Schema({
answerId: {
type: ObjectId
},
createAt: {
type: Date ,
default:Date.now
},
ip:{
type: String,
index:true
}
});

mongoose.model('IpAnswerLog', IpAnswerLog);

Zugehöriger Proxy-Code:

Code kopieren Der Code lautet wie folgt:

/**
 * Erstellt von YCXJ-wanglihui am 28.05.2014.
 */
'use strict';

var IpAnswerLog = require('../models').IpAnswerLog;

/**
* Neu erstellen und speichern
* @param ipAnswerLog {Schema oder dict}
* @param callback
*/
var newAndSave = function(ipAnswerLog, callback){
    if(ipAnswerLog instanceof IpAnswerLog){
        ipAnswerLog.save(callback);
    }else{
        var m = new IpAnswerLog(ipAnswerLog);
        m.save(callback);
    }
}

/**
* Anzahl der Antworten innerhalb einer Minute
* @param ip
* @param callback
*/
var countOneMinuteAnswer = function(ip, callback){
    var endTime = Date.now();
    var beginTime = endTime - 1000*60*1;
    countIpAnswerByTime(beginTime, endTime, ip, callback);
}

/**
* Antwortnummer innerhalb einer Stunde
* @param ip
* @param Rückruf
*/
var countOneHourAnswer = function(ip, callback){
    var endTime = Date.now();
    var beginTime = endTime - 1000*60*60* 1;
    countIpAnswerByTime(beginTime, endTime, ip, callback);
}

/**
* Antwort innerhalb eines Tages
* @param ip
* @param callback
*/
var countOneDayAnswer = function(ip, callback){
    var endTime = Date.now();
    var beginTime = endTime - 1000*60*60* 24;
    countIpAnswerByTime(beginTime, endTime, ip, callback);
}

/**
* Berechnen Sie die Anzahl der Antworten innerhalb eines bestimmten Zeitraums
* @param beginTime {Number} Zeitstempel der Startzeit
* @param endTime {Number} Wenn die Endzeit null ist, verwenden Sie den aktuellen Zeitstempel
* @param ip {String} IP-Adresse
* @param callback
*/
var countIpAnswerByTime = function(beginTime, endTime, ip, callback){
    if(!endTime){
        endTime = Date.now();
    }
    IpAnswerLog.count({ip:ip, '$and':{$lt:beginTime, $gt:endTime}}, callback);
}

exports.countIpAnswerByTime =countIpAnswerByTime;
exports.countOneDayAnswer = countOneDayAnswer;
exports.countOneHourAnswer = countOneHourAnswer;
exports.countOneMinuteAnswer = countOneMinuteAnswer;
exports.newAndSave = newAndSave;

黑名单Proxy:

复制代码 代码如下:

/**
 * Created by YCXJ-wanglihui on 2014/5/28.
 */
'use strict';
var BlackList = require('../models').BlackList;

/**
 * 新建并保存
 * @param backList {BlackList} or {dict} 黑名单数据
 * @param callback
 */
var newAndSave = function(backList, callback){
    if(backList instanceof BlackList){
        backList.save(callback);
    }else{
        var m = new BlackList(backList);
        m.save(callback);
    }
}

/**
 * 禁用Ip访问一小时
 * @param ip {String}
 * @param callback
 */
var newAndSaveOneHourTempForbidden = function(ip, callback){
    var expireTime = Date.now() + 1000*60*60;
    newAndSaveTempForbidden(ip,expireTime, callback);
}

/**
 * 禁用一天
 * @param ip {String}
 * @param callback
 */
var newAndSaveOneDayTempForbidden = function(ip, callback){
    var expireTime = Date.now() + 1000*60*60*24;
    newAndSaveTempForbidden(ip, expireTime, callback);
}

/**
 * 新建临时黑名单
 * @param ip {String}
 * @param expireTime {Number} 到期时间
 * @param callback
 */
var newAndSaveTempForbidden = function(ip, expireTime,callback){
    var blackList = new BlackList({ip:ip, expireTime:expireTime, forbiddenDegree:1});
    newAndSave(blackList, callback);
}

/**
 * 新建并保存永久黑名单
 * @param ip
 * @param callback
 */
var newAndSaveForeverForbidden = function(ip, callback){
    var blackList = new BlackList({ip:ip, forbiddenDegree:2});
    newAndSave(blackList, callback);
}

/**
 * 判断是否在黑名单中
 * @param ip {String} Ip地址
 * @param callback
 */
var isInBlackList = function(ip, callback){
    getBlackListByIp(ip, function(err, blackList){
        if(err){
            callback(err);
        }else if(blackList){
            var currentDate = Date.now();
            if(blackList.forbiddenDegree ===1 && blackList.expireTime> currentDate){
                removeBlackListByIp(ip, function(err){
                    if(err){
                        callback(err);
                    }else{
                        callback(null, false);
                    }
                })
            }else{
                callback(null, true);
            }
        }else{
            callback(null, false);
        }
    })
}

/**
 * 通过Ip获取黑名单条目
 * @param ip
 * @param callback
 */
var getBlackListByIp = function(ip, callback){
    BlackList.findOne({ip:ip}, callback);
}

/**
* Blacklist basierend auf IP löschen
* @param ip
* @param callback
*/
var removeBlackListByIp = function(ip, callback){
    getBlackListByIp(ip, function(err, blackList){
        if(err){
            Callback (err) })
}

exports.newAndSave = newAndSave;
exports.isInBlackList = isInBlackList;
exports.getBlackListByIp = getBlackListByIp;
exports.removeBlackListByIp = takeBlackListByIp;
exports.newAndSaveOneHourTempForbidden = OneHourTempForbidden;

Exporte. newAndSaveOneDayTempForbidden = newAndSaveOneDayTempForbidden;

exports.newAndSaveForeverForbidden = newAndSaveForeverForbidden;
exports.newAndSaveTempForbidden = newAndSaveTempForbidden;



中间件详情:


复制代码

代码如下:

/**
 * Created by YCXJ-wanglihui on 2014/5/28.
 */
'use strict';

var BlackListProxy = require('../../proxy').BlackListPorxy;
var IpAnswerLogProxy = require('../../proxy').IpAnswerLogProxy;
var EventProxy = require('eventproxy');

/**
 * 判断是否需要将Ip移动至黑名单中
 * @param req
 * @param res
 * @param next
 */
var isNeedMoveToBlackList = function(req, res, next){
    var ip = req.ip;
    //判断是否在黑名单中
    requireNotInBlackList(req, res, function(){
        var ep = new EventProxy();
        ep.fail(next);

        ep.all('minuteCount', 'hourCount', 'dayCount', function(minuteCount, hourCount, dayCount){
            if(minuteCount > 10){
                BlackListProxy.newAndSaveOneHourTempForbidden(ip, function(err, blackList){
                    if(err){
                        return next(err);
                    }else{
                        return res.send('提交过于频繁,1小时后重试!');
                    }
                });
            }else if(hourCount > 100){
                BlackListProxy.newAndSaveOneDayTempForbidden(ip, function(err, blackList){
                    if(err){
                        return next(err);
                    }else{
                        return res.send('提交过于频繁,1天后重试!');
                    }
                })
            }else if(dayCount > 1000){
                BlackListProxy.newAndSaveOneDayTempForbidden(ip, function(err, blackList){
                    if(err){
                        return next(err);
                    }else{
                        return res.send('提交过于频繁,1天后重试!');
                    }
                })
            }else{
                return next();
            }
        })

        IpAnswerLogProxy.countOneMinuteAnswer(ip,ep.done('minuteCount'));
        IpAnswerLogProxy.countOneHourAnswer(ip, ep.done('hourCount'));
        IpAnswerLogProxy.countOneDayAnswer(ip, ep.done('dayCount'));
    });
}

/**
* Middleware nécessite que l'IP ne soit pas dans la liste noire
* @param req
* @param res
* @param next
*/
var requireNotInBlackList = function(req, res, next){
var ip = req.ip;
BlackListProxy.isInBlackList(ip, function(err, result ){
if(err){
next(err);
}else if(result){
return res.send('Votre adresse IP ne peut pas être soumise. Si vous avez des questions, veuillez contacter lihui. wang@tulingdao.com');
      }else{
                   suivant();                                                           
exports.isNeedMoveToBlackList = isNeedMoveToBlackList;
exports.requireNotInBlackList = requireNotInBlackList;


Utilisation en routage :

Copier le code

Le code est le suivant ://Interface de soumission de page Web router.post( '/create', middleware.isNeedMoveToBlackList, paperAnswers.create);

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn