ホームページ >ウェブフロントエンド >jsチュートリアル >nodejs はブラックリスト ミドルウェア design_node.js を実装します。

nodejs はブラックリスト ミドルウェア design_node.js を実装します。

WBOY
WBOYオリジナル
2016-05-16 16:44:041600ブラウズ

ブラックリスト スキーマ:

コードをコピー コードは次のとおりです:

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

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

//1. 一時的なブロック 2. 永久的なブロック
vardegree = {TEMP:1, FOREVER:2};

/**
* ブラックリスト
* @type {スキーマ}
*
* @param ip {文字列} ブラックリスト Ip
* @param createAt {日付} 作成時刻
* @paramexpireTime { Date} 一時的なブロックの場合、ブロックの有効期限
* @paramforbiddenDegree {Number} ブロックレベル 1. 一時的なブロック 2. 永続的なブロック
* @paramreason {String} ブロックの理由
*/
var BlackList = new Schema({
ip:{
type: String,
Index:true
},
createAt: {
タイプ: 日付,
デフォルト: Date.now
},
expireTime:{
タイプ: 日付
},
禁断度:{
タイプ: 数値,
デフォルト:degree.TEMP
},
理由:{
タイプ: 文字列,
デフォルト: '頻繁なリクエスト'
}
});

mongoose.model('BlackList', BlackList);

IP および提出レコードのスキーマ:

コードをコピー コードは次のとおりです:

/**
* 2014/5/28 に YCXJ-wanglihui によって作成されました。
 */

'厳密に使用';

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

/**
* 参加しているアンケートの回答と IP を記録します
* @type {Schema}
*
* @param AnswerId {ObjectId} Reply Id
* @param createAt {Date} 作成時刻
* @param ip {String} 返信に参加している人の IP
*/
var IpAnswerLog = new Schema({
AnswerId: {
type: ObjectId
},
createAt: {
type: Date 、
デフォルト:Date.now
},
ip:{
タイプ: String,
インデックス:true
}
});

mongoose.model('IpAnswerLog', IpAnswerLog);

関連するプロキシ コード:

コードをコピー コードは次のとおりです:

/**
* 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){
if(err){
callback (err);
}else if(blackList){
blackList.remove(callback);
}else{
callback(null,null);
}
})
}

exports.newAndSave = newAndSave;
exports.isInBlackList = isInBlackList;
exports.getBlackListByIp = getBlackListByIp;
exports.removeBlackListByIp =moveBlackListByIp;
exports.newAndSaveOneHourTempForbidden = newAndSaveOneHourTemp禁止;
輸出。 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'));
    });
}

/**
* ミドルウェアでは、IP がブラックリストに含まれていないことが必要です
* @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('あなたの IP は送信が禁止されています。ご質問がある場合は、 lihui までご連絡ください。wang@tulingdao.com');
}else{
next();
exports.isNeedMoveToBlackList = isNeedMoveToBlackList;
exports.requireNotInBlackList = requireNotInBlackList;


ルーティングで使用:

コードをコピー

コードは次のとおりです://Web ページ送信インターフェイス router.post( '/create', middleware.isNeedMoveToBlackList,paperAnswers.create);

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。