nodejs implementiert die Blacklist-Middleware design_node.js
May 16, 2016 pm 04:44 PMBlacklist-Schema:
/**
* 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:
/**
* 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:
/**
* 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;
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

Heißer Artikel

Hot-Tools-Tags

Heißer Artikel

Heiße Artikel -Tags

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Der Unterschied zwischen NodeJS und Tomcat

Der Unterschied zwischen NodeJS und VueJS

Was ist der Unterschied zwischen den Dateien npm und npm.cmd im Installationsverzeichnis von nodejs?

Ist NodeJS eine Back-End-Entwicklungssprache?

Was sind die globalen Variablen in NodeJS?

Gibt es einen großen Unterschied zwischen NodeJS und Java?

Welches soll man zwischen NodeJS und Java wählen?
