首頁  >  文章  >  web前端  >  nodejs實作黑名單中間件設計_node.js

nodejs實作黑名單中間件設計_node.js

WBOY
WBOY原創
2016-05-16 16:44:041587瀏覽

黑名單Schema:

複製程式碼 程式碼如下:

/**
 * 由YCXJ-wanglihui於2014/5/28創作。
 */
' use strict';

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

//1.短暫屏蔽 2.永久屏蔽
var degree = {TEMP:1, FOREVER:2};

/**
 * 黑名單
 * @type {Schema}
 *
 * @param ip {String} 黑名單Ip
 * @param createAt {Date} 建立時間 * @param forbiddenDegree {Number} 屏蔽等級1.短暫屏蔽2.永久屏蔽
 * @param reason {String} 屏蔽原因
 */
var BlackList = new Schema({
    ip:{
          createAt: {
        type: Date,
        default: Date.now
    },  },
    forbiddenDegree:{
        type: Number ,
        default:degree.TEMP
    },
    reason:{
   >    }
});

mongoose.model('BlackList', BlackList);



IP與提交記錄Schema:



複製程式碼

程式碼如下:

/** * 由YCXJ-wanglihui於2014/5/28創作。  *//** * 記錄參與問卷的回覆與Ip
 * @type {Schema}
 *
 * @param answerId {ObjectId} 回覆Id
 * @param createAt {Date}
 * @param ip {String} 參與回覆的人Ip */

*/

*/*/'use strict';

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

var ObjectId = Schema.ObjectId;

/***/
var IpAnswerLog = new Schema({
    answerId: {
             type: Date ,
        default:Date.now
    },
    ip:{
     
});

mongoose.model('IpAnswerLog', IpAnswerLog);



相關Proxy程式碼:



複製程式碼

程式碼如下:


/**
* 2014/5/28 に YCXJ-wanglihui によって作成されました。
 */
'厳密な使用';

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

/**
* 新規作成して保存
* @param ipAnswerLog {スキーマまたは辞書}
* @param callback
*/
var newAndSave = function(ipAnswerLog, callback){
if(ipAnswerLog instanceof IpAnswerLog){
ipAnswerLog.save(callback);
}else{
var m = new IpAnswerLog(ipAnswerLog);
m.save(callback);
}
}

/**
* 1 分間の返信数
* @param ip
* @param callback
*/
var countOneMinuteAnswer = function(ip, callback){
var endTime = Date.now();
var beginTime = endTime - 1000*60*1;
countIpAnswerByTime(beginTime, endTime, ip, callback);
}

/**
* 1 時間以内に番号を返信
* @param ip
* @param callback
*/
var countOneHourAnswer = function(ip, callback){
var endTime = Date.now();
var beginTime = endTime - 1000*60*60* 1;
countIpAnswerByTime(beginTime, endTime, ip, callback);
}

/**
* 1日以内に返信
* @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);
}

/**
* 一定期間内の返信数を計算します
* @param beginTime {Number} 開始時刻のタイムスタンプ
* @param endTime {Number} 終了時刻が null の場合は、現在の時刻のタイムスタンプを使用します
* @param ip {String} IP アドレス
* @param コールバック
*/
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 =保存;

黑名单プロキシ:

复制代码代码如下:

/**
 * 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);
}

/**
 * 依照Ip刪除黑名單
 * @param ip
 * @param callback
 */
var removeBlackListByIp = function(ip,callback){
    getBlackListByIp(ip, function(err, blackList){        }else if(blackList){
            blackList     回呼(null,null);
        }
   } )
}

exports.newAndSave = newAndSave;
exports.isInBlackList = isInBlackList;
exports.getBlackListByIp = getBlackListByIp;

Blackports。 newAndSaveOneHourTempForbidden;

出口。 newAndSaveOneDayTempForbidden = newAndSaveOneDayTempForbidden;
exports.newAndSaveForeverForbidden = newAndSaveForeverForbidden;
exports.newAndSaveTempForbidden = newAndbidden;
exports.new;
中間件詳情:



複製程式碼

程式碼如下:


/**
 * 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'));
    });
}

/**
 * 中間件 要求Ip不在黑名單中
 * @param req
 * @param res
 * @param next
 */
var requireNotInBlackList = function(req, res, next){
    var ip = req.ip;
  ){
        if(err){
            next(err);
   res.send('您的Ip禁止提交,如有疑問請聯絡lihui. wang@tulingdao.com');
        }else{
            
exports.isNeedMoveToBlackList = isNeedMoveToBlackList;
exports.requireNotInBlackList = requireNotInBlackList;

在路由中使用:

複製程式碼

程式碼如下://網頁提交介面router. '/create', middleware.isNeedMoveToBlackList, paperAnswers.create);
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn