ブラックリストスキーマ:
コードコピーは次のとおりです。
/**
* 2014/5/28にYcxj-Wanglihuiによって作成されました。
*/
「Strictを使用」;
var mongoose = require( 'mongoose');
var schema = mongoose.schema;
// 1。短期ブロッキング2。永久ブロッキング
var度= {temp:1、forever:2};
/**
*ブラックリスト
* @type {schema}
*
* @param ip {string}ブラックリストIP
* @param createat {date}作成時間
* @param expiretime {date}それが短いブロックの場合、有効期限をブロックする
* @param forbiddendegree {number}ブロッキングレベル1。短期ブロッキング2。永続的なブロック
* @param理由{文字列}ブロッキング理由
*/
var blacklist = new Schema({
IP:{
タイプ:文字列、
インデックス:true
}、
createat:{
タイプ:日付、
デフォルト:date.now
}、
expiretime:{
タイプ:日付
}、
forbiddendegree:{
タイプ:番号、
デフォルト:degree.temp
}、
理由:{
タイプ:文字列、
デフォルト:「頻繁にリクエスト」
}
});
mongoose.model( 'blacklist'、blacklist);
IPおよび提出レコードスキーマ:
コードコピーは次のとおりです。
/**
* 2014/5/28にYcxj-Wanglihuiによって作成されました。
*/
「Strictを使用」;
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:{
タイプ:ObjectID
}、
createat:{
タイプ:日付、
デフォルト:date.now
}、
IP:{
タイプ:文字列、
インデックス:true
}
});
mongoose.model( 'ipanswerlog'、ipanswerlog);
関連プロキシコード:
コードコピーは次のとおりです。
/**
* 2014/5/28にYcxj-Wanglihuiによって作成されました。
*/
「Strictを使用」;
var ipanswerlog = require( '../ models')。ipanswerlog;
/**
*作成して保存します
* @param ipanswerlog {schemaまたはdict}
* @paramコールバック
*/
var newandsave = function(ipanswerlog、callback){
if(ipanswerlog instanceof ipanswerlog){
ipanswerlog.save(callback);
}それ以外{
var m = new ipanswerlog(ipanswerlog);
M.Save(コールバック);
}
}
/**
* 1分以内に返信数
* @Param IP
* @paramコールバック
*/
var countoneminuteanswer = function(ip、callback){
var endtime = date.now();
var begintime = endtime -1000*60*1;
Couthipanswerbytime(begintime、endtime、ip、callback);
}
/**
* 1時間以内に番号に返信します
* @Param IP
* @paramコールバック
*/
var countonehouranswer = function(ip、callback){
var endtime = date.now();
var begintime = endtime -1000*60*60*1;
Couthipanswerbytime(begintime、endtime、ip、callback);
}
/**
* 1日以内に返信します
* @Param IP
* @paramコールバック
*/
var countonedayanswer = function(ip、callback){
var endtime = date.now();
var begintime = endtime -1000*60*60*24;
Couthipanswerbytime(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 = newandsave;
ブラックリストのプロキシ:
コードコピーは次のとおりです。
/**
* 2014/5/28にYcxj-Wanglihuiによって作成されました。
*/
「Strictを使用」;
var blacklist = require( '../ models')。ブラックリスト;
/**
*作成して保存します
* @paramバックリスト{ブラックリスト}または{dict}ブラックリストデータ
* @paramコールバック
*/
var newandsave = function(backlist、callback){
if(ブラックリストのバックリストインスタンス){
backlist.save(callback);
}それ以外{
var m = new Blacklist(バックリスト);
M.Save(コールバック);
}
}
/**
* IPアクセスを1時間無効にします
* @param ip {string}
* @paramコールバック
*/
var newandsaveOneHourtempforbidden = function(ip、callback){
var expiretime = date.now() + 1000*60*60;
NewandSaveTempForBidden(IP、expiretime、callback);
}
/**
* 1日無効にします
* @param ip {string}
* @paramコールバック
*/
var newandsaveonedaytempforbidden = function(ip、callback){
var expiretime = date.now() + 1000*60*60*24;
NewandSaveTempForBidden(IP、expiretime、callback);
}
/**
*一時的なブラックリストを作成します
* @param ip {string}
* @param expiretime {number}有効期間
* @paramコールバック
*/
var newandsavetempforbidden = function(ip、expiretime、callback){
var blacklist = new Blacklist({ip:ip、expiretime:expiretime、forbiddendegree:1});
NewandSave(ブラックリスト、コールバック);
}
/**
*永続的なブラックリストを作成して保存します
* @Param IP
* @paramコールバック
*/
var newandsaveforeverforbidden = function(ip、callback){
var blacklist = new BlackList({IP:IP、forbidDendegree:2});
NewandSave(ブラックリスト、コールバック);
}
/**
*ブラックリストに載っているかどうかを判断します
* @Param IP {String} IPアドレス
* @paramコールバック
*/
var isinblacklist = function(ip、callback){
getBlackListByip(IP、function(err、blacklist){
if(err){
コールバック(err);
} else if(blacklist){
var currentdate = date.now();
if(blacklist.forbiddendegree === 1 && blacklist.expiretime> currentDate){
removalBlackListByip(IP、function(err){
if(err){
コールバック(err);
}それ以外{
コールバック(null、false);
}
})
}それ以外{
コールバック(null、true);
}
}それ以外{
コールバック(null、false);
}
})
}
/**
* IPを介してブラックリストの入力を取得します
* @Param IP
* @paramコールバック
*/
var getBlackListByip = function(ip、callback){
Blacklist.findone({ip:ip}、callback);
}
/**
* IPに従ってブラックリストを削除します
* @Param IP
* @paramコールバック
*/
var removeblackListbyIp = function(ip、callback){
getBlackListByip(IP、function(err、blacklist){
if(err){
コールバック(err);
} else if(blacklist){
BlackList.Remove(コールバック);
}それ以外{
コールバック(null、null);
}
})
}
exports.newandsave = newandsave;
exports.isinblackList = isinblackList;
Exports.getBlackListByIP = getBlackListByIp;
exports.removeBlackListByIP = RemoveBlackListByIp;
exports.newandsaveOneHourtempforBidden = newandSaveOneHourtempforBidden;
exports.newandsaveonedaytempforbidden = newandsaveonedaytempforbidden;
exports.newandsaveforeverforbidden = newandsaveforeverforbidden;
exports.newandsavetempforbidden = newandsavetempforbidden;
ミドルウェアの詳細:
コードコピーは次のとおりです。
/**
* 2014/5/28にYcxj-Wanglihuiによって作成されました。
*/
「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;
//ブラックリストに載っているかどうかを判断します
requeNotinBlackList(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){
次に戻ります(err);
}それ以外{
return res.send( '提出が頻繁すぎるので、1時間後に再試行してください!');
}
});
} else if(hourcount> 100){
BlackListProxy.NewandSaveOnedayTempForBidden(IP、Function(ERR、BLACKLIST){
if(err){
次に戻ります(err);
}それ以外{
return res.send( '提出物はあまりにも頻繁です。1日後にもう一度やり直してください!');
}
})
} else if(daycount> 1000){
BlackListProxy.NewandSaveOnedayTempForBidden(IP、Function(ERR、BLACKLIST){
if(err){
次に戻ります(err);
}それ以外{
return res.send( '提出物はあまりにも頻繁です。1日後にもう一度やり直してください!');
}
})
}それ以外{
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 requeenotinblacklist = 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は送信が禁止されています。質問がある場合は、[email protected]'に連絡してください);
}それ以外{
次();
}
})
}
Exports.isNeedMovetoBlackList = isNeedMovetoBlackList;
Exports.RequirenotinBlackList = requireNotinBlackList;
ルーティングでの使用:
コードコピーは次のとおりです。
// Webページ送信インターフェイス
router.post( '/create'、middleware.isneedmovetoblacklist、paperanswers.create);