Схема черного списка:
Кода -копия выглядит следующим образом:
/**
* Создан YCXJ-Wanglihui 2014/5/28.
*/
«Использовать строго»;
var mongoose = require ('mongoose');
var schema = mongoose.schema;
// 1. Краткосрочная блокировка 2. Постоянная блокировка
var degraph = {temp: 1, forever: 2};
/**
* Черный список
* @Type {схема}
*
* @param ip {string} blacklist ip
* @param createat {date} время создания
* @param extireTime {date} Если это краткое блокирование, время истечения срока действия блокировки
* @param forbiddendegree {number} blocking level 1. Краткосрочная блокировка 2. Постоянная блокировка
* @param conse {string} blocking wance
*/
var blacklist = новая схема ({
ip: {
Тип: строка,
Индекс: верно
},
Createat: {
Тип: дата,
по умолчанию: дата
},
ExpitreTime: {
Тип: дата
},
forbiddendegree: {
Тип: номер,
по умолчанию: Degraph.temp
},
причина:{
Тип: строка,
по умолчанию: «Частые запросы»
}
});
mongoose.model ('BlackList', BlackList);
IP и схема записи отправки:
Кода -копия выглядит следующим образом:
/**
* Создан YCXJ-Wanglihui 2014/5/28.
*/
«Использовать строго»;
var mongoose = require ('mongoose');
var schema = mongoose.schema;
var objectId = schema.objectid;
/**
* Запись ответов и IP участия в вопроснике
* @Type {схема}
*
* @param answerd {objectId} идентификатор ответа
* @param createat {date} время создания
* @param ip {string} люди, которые участвовали в ответном IP
*/
var ipanswerlog = новая схема ({
answerd: {
Тип: ObjectId
},
Createat: {
Тип: дата,
по умолчанию: дата
},
ip: {
Тип: строка,
Индекс: верно
}
});
mongoose.model ('ipanswerlog', ipanswerlog);
Связанный прокси -код:
Кода -копия выглядит следующим образом:
/**
* Создан YCXJ-Wanglihui 2014/5/28.
*/
«Использовать строго»;
var ipanswerlog = require ('../ models'). ipanswerlog;
/**
* Создать и сохранить
* @param ipanswerlog {schema или dict}
* @param обратный вызов
*/
var newandsave = function (ipanswerlog, callback) {
if (ipanswerlog ancessionof ipanswerlog) {
ipanswerlog.save (обратный вызов);
}еще{
var m = new ipanswerlog (ipanswerlog);
M.Save (обратный вызов);
}
}
/**
* Количество ответов в течение одной минуты
* @param ip
* @param обратный вызов
*/
var counttoneminuteanswer = function (ip, callback) {
var EndTime = date.now ();
var bomintime = endtime - 1000*60*1;
Countipanswerbytime (Betrintime, EndTime, IP, обратный вызов);
}
/**
* Ответьте на номера в течение одного часа
* @param ip
* @param обратный вызов
*/
var countonehouranswer = function (ip, обратный вызов) {
var EndTime = date.now ();
var bomintime = endtime - 1000*60*60*1;
Countipanswerbytime (Betrintime, EndTime, IP, обратный вызов);
}
/**
* Ответить в течение одного дня
* @param ip
* @param обратный вызов
*/
var countonayAnswer = function (ip, обратный вызов) {
var EndTime = date.now ();
var bomintime = endtime - 1000*60*60*24;
Countipanswerbytime (Betrintime, EndTime, IP, обратный вызов);
}
/**
* Рассчитайте количество ответов за определенный период времени
* @param betintime {number} марки времени начала времени
* @param endtime {number} Время окончания Если NULL, используйте текущую временной маршрут
* @param ip {string} IP -адрес
* @param обратный вызов
*/
var countipanswerbytime = function (betrintime, endtime, ip, обратный вызов) {
if (! endtime) {
EndTime = date.now ();
}
Ipanswerlog.count ({ip: ip, '$ и': {$ lt: Betrintime, $ gt: endtime}}, обратный вызов);
}
exports.countipanswerbytime = countipanswerbytime;
exports.countonayanswer = countonayAnswer;
exports.countonehouranswer = countonehouranswer;
exports.counteminuteanswer = counttoneminuteanswer;
exports.newandsave = newandsave;
Прокси -сервер черного списка:
Кода -копия выглядит следующим образом:
/**
* Создан YCXJ-Wanglihui 2014/5/28.
*/
«Использовать строго»;
var blacklist = require ('../ models'). Blacklist;
/**
* Создать и сохранить
* @param Backlist {BlackList} или {dict} данные черного списка
* @param обратный вызов
*/
var newandsave = function (backlist, callback) {
if (экземпляр Backlist BlackList) {
Backlist.save (обратный вызов);
}еще{
var m = новый черный список (Backlist);
M.Save (обратный вызов);
}
}
/**
* Отключить доступ к IP в течение одного часа
* @param ip {string}
* @param обратный вызов
*/
var newandsaveonehourtempforbidden = function (ip, обратный вызов) {
var expireTime = date.now () + 1000*60*60;
newandsavetempforbidden (IP, ExtireTime, обратный вызов);
}
/**
* Отключить на один день
* @param ip {string}
* @param обратный вызов
*/
var newandsaveodeytempforbidden = function (ip, обратный вызов) {
var expireTime = date.now () + 1000*60*60*24;
newandsavetempforbidden (IP, ExtireTime, обратный вызов);
}
/**
* Создать временный черный список
* @param ip {string}
* @param expiretime {number} Время истечения
* @param обратный вызов
*/
var newandsavetempforbidden = function (ip, expiretime, обратный вызов) {
var blacklist = new Blacklist ({ip: ip, expiretTime: expiretime, forbiddendegree: 1});
Newandsave (Blacklist, обратный вызов);
}
/**
* Создать и сохранить постоянный черный список
* @param ip
* @param обратный вызов
*/
var newandsaveforeverforbidden = function (ip, обратный вызов) {
var blacklist = new Blacklist ({ip: ip, forbiddendegree: 2});
Newandsave (Blacklist, обратный вызов);
}
/**
* Определите, есть ли это в черном списке
* @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) {
RemoveBlackListByip (ip, function (err) {
if (err) {
обратный вызов (ERR);
}еще{
обратный вызов (null, false);
}
})
}еще{
обратный вызов (null, true);
}
}еще{
обратный вызов (null, false);
}
})
}
/**
* Получить запись в черном списке через IP
* @param ip
* @param обратный вызов
*/
var getBlackListByip = function (ip, обратный вызов) {
Blacklist.findone ({ip: ip}, обратный вызов);
}
/**
* Удалить черный список в соответствии с IP
* @param ip
* @param обратный вызов
*/
var removeblacklipbyip = function (ip, обратный вызов) {
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 = removerblacklistbyip;
exports.newandsaveOnehourtempforbidden = newandsaveOnehourtempforbidden;
Exports.newandSaveOneyTempforbidden = newandsaveodepenaytempforbidden;
exports.newandsaveforeverforbidden = newandsaveforeverforbidden;
exports.newandsavetempforbidden = newandsavetempforbidden;
Детали промежуточного программного обеспечения:
Кода -копия выглядит следующим образом:
/**
* Создан YCXJ-Wanglihui 2014/5/28.
*/
«Использовать строго»;
var blacklistproxy = require ('../../ proxy'). BlackListPorxy;
var ipanswerlogproxy = require ('../../ proxy'). ipanswerlogproxy;
var eventProxy = require ('eventProxy');
/**
* Определите, нужно ли мне переместить IP в черный список
* @param req
* @param res
* @param Далее
*/
var isneedmovetoblacklist = function (req, res, затем) {
var ip = req.ip;
// судить, есть ли это в черном списке
repteNotinBlacklist (req, res, function () {
var ep = new EventProxy ();
ep.fail (Далее);
ep.all ('minutecount', 'Hourcount', 'Daycount', Function (minutecount, dourcount, daycount) {
if (minutecount> 10) {
BlackListProxy.newandSaveOneHourtempforBidden (ip, function (err, blacklist) {
if (err) {
вернуть следующий (err);
}еще{
return res.send («Представление слишком часто, попробуйте еще раз через 1 час!»);
}
});
} else if (Hourcount> 100) {
BlackListProxy.NewandSaveOneTempforBidden (ip, function (err, blacklist) {
if (err) {
вернуть следующий (err);
}еще{
return res.send ('Материалы слишком часты, попробуйте еще раз через 1 день!');
}
})
} else if (daycount> 1000) {
BlackListProxy.NewandSaveOneTempforBidden (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.countoneyanswer (ip, ep.done ('daycount'));
});
}
/**
* Промежуточное программное обеспечение требует, чтобы IP не был в черном списке
* @param req
* @param res
* @param Далее
*/
var retplyenotinblacklist = 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 = reptenotinblacklist;
Используйте при маршрутизации:
Кода -копия выглядит следующим образом:
// интерфейс представления веб -страницы
router.post ('/create', Middleware.isneedmovetoblacklist, paperanswers.create);