Esquema da lista negra:
A cópia do código é a seguinte:
/**
* Criado por YCXJ-Wanglihui em 2014/5/28.
*/
'Use rigoroso';
var de Mongoose = requer ('Mongoose');
var schema = mongoose.schema;
// 1. Bloqueio de curto prazo 2. Bloqueio permanente
var grau = {temp: 1, para sempre: 2};
/**
* Lista negra
* @Type {Schema}
*
* @param ip {string} Blacklist IP
* @param createat {date} hora de criação
* @param expireTime {date} Se for um breve bloqueio, o tempo de expiração do bloco
* @param provebiddenderee {número} bloqueando o nível 1. Bloqueio de curto prazo 2. Bloqueio permanente
* @param Razão {String} Bloqueio
*/
var Blacklist = novo esquema ({
IP: {
Tipo: string,
ÍNDICE: True
},
createat: {
Tipo: data,
Padrão: DATE.NOW
},
ExpireTime: {
Tipo: data
},
provebiddendegree: {
Tipo: Número,
Padrão: grau.temp
},
razão:{
Tipo: string,
Padrão: 'solicitações frequentes'
}
});
mongoose.model ('Blacklist', lista negra);
Esquema de registro de IP e envio:
A cópia do código é a seguinte:
/**
* Criado por YCXJ-Wanglihui em 2014/5/28.
*/
'Use rigoroso';
var de Mongoose = requer ('Mongoose');
var schema = mongoose.schema;
var objectId = schema.ObjectId;
/**
* Registrar respostas e IP de participar do questionário
* @Type {Schema}
*
* @param ResponderId {objectId} Responder ID
* @param createat {date} hora de criação
* @param ip {string} pessoas que participaram da resposta IP
*/
var iPanswerLog = novo esquema ({
ResponderID: {
Tipo: ObjectId
},
createat: {
Tipo: data,
Padrão: DATE.NOW
},
IP: {
Tipo: string,
ÍNDICE: True
}
});
mongoose.model ('ipanswerlog', ipanswerlog);
Código de proxy relacionado:
A cópia do código é a seguinte:
/**
* Criado por YCXJ-Wanglihui em 2014/5/28.
*/
'Use rigoroso';
var iPanswerLog = requer ('../ modelos'). ipanswerLog;
/**
* Criar e salvar
* @param ipanswerlog {schema ou dict}
* @param retorno de chamada
*/
var newandSave = function (ipanswerLog, retorno de chamada) {
if (IPANSWERLOG Instância do ipanswerLog) {
iPanswerLog.Save (retorno de chamada);
}outro{
var m = novo ipanswerLog (iPanswerLog);
M.Save (retorno de chamada);
}
}
/**
* Número de respostas em um minuto
* @param ip
* @param retorno de chamada
*/
var CountOneMinUteanSwer = function (IP, retorno de chamada) {
var endtime = date.now ();
var BeginTime = EndTime - 1000*60*1;
CountipansWerByTime (BeginTime, Endtime, IP, Retorno de chamada);
}
/**
* Responder aos números dentro de uma hora
* @param ip
* @param retorno de chamada
*/
var CountOneHouranswer = função (IP, retorno de chamada) {
var endtime = date.now ();
Var BeginTime = Endtime - 1000*60*60*1;
CountipansWerByTime (BeginTime, Endtime, IP, Retorno de chamada);
}
/**
* Responder dentro de um dia
* @param ip
* @param retorno de chamada
*/
var CounteneDayanswer = função (IP, retorno de chamada) {
var endtime = date.now ();
Var BeginTime = Endtime - 1000*60*60*24;
CountipansWerByTime (BeginTime, Endtime, IP, Retorno de chamada);
}
/**
* Calcule o número de respostas em um certo período de tempo
* @param BeginTime {Número} Start Horet Time Stamp
* @param endtime {número} hora de término se nulo, use o estampamento atual do tempo
* @param ip {string} endereço IP
* @param retorno de chamada
*/
Var CountipansWerByTime = função (BeginTime, Endtime, IP, Retorno) {
if (! Endtime) {
endtime = date.now ();
}
IpanswerLog.count ({ip: ip, '$ e': {$ lt: beginMe, $ gt: endtime}}, retorno de chamada);
}
exports.countipanswerbytime = countipanswerbytime;
exports.CountoneDayanswer = CounteneDayanswer;
exports.CountOneHouranswer = CountOneHouranswer;
exports.CountOneMinUteanSwer = CountOneMinUteanwer;
exports.newandSave = newandSave;
Proxy da lista negra:
A cópia do código é a seguinte:
/**
* Criado por YCXJ-Wanglihui em 2014/5/28.
*/
'Use rigoroso';
var Blacklist = requer ('../ modelos'). Lista negra;
/**
* Criar e salvar
* @param backlist {Blacklist} ou {dict} dados da lista negra
* @param retorno de chamada
*/
var newandSave = function (lista de retorno, retorno de chamada) {
if (instância da lista de backlist da lista negra) {
lista de backlist.save (retorno de chamada);
}outro{
var m = nova lista negra (lista de fundo);
M.Save (retorno de chamada);
}
}
/**
* Desative o acesso IP por uma hora
* @param ip {string}
* @param retorno de chamada
*/
var newandSaveOneHourTempForbidden = function (IP, retorno de chamada) {
var expireTime = date.now () + 1000*60*60;
newandSaveTempforbidden (IP, ExpireTime, Retorno de chamada);
}
/**
* Desativar por um dia
* @param ip {string}
* @param retorno de chamada
*/
var newandSaveOnedAyTempForbidden = function (IP, retorno de chamada) {
var expireTime = date.now () + 1000*60*60*24;
newandSaveTempforbidden (IP, ExpireTime, Retorno de chamada);
}
/**
* Crie uma lista negra temporária
* @param ip {string}
* @param expiretime {número} Tempo de expiração
* @param retorno de chamada
*/
var newandSaveTempforbidden = function (ip, expiretime, retorno de chamada) {
var Blacklist = new Blacklist ({ip: ip, expireTime: expireTime, provebiddendegree: 1});
newandsave (lista negra, retorno de chamada);
}
/**
* Crie e salve uma lista negra permanente
* @param ip
* @param retorno de chamada
*/
var newandSaveForeverForbidden = function (IP, retorno de chamada) {
var Blacklist = new Blacklist ({ip: ip, provebiddendegree: 2});
newandsave (lista negra, retorno de chamada);
}
/**
* Determinar se está na lista negra
* @param ip {string} endereço IP
* @param retorno de chamada
*/
var isinblacklist = function (ip, retorno de chamada) {
getBlackListByip (IP, função (err, lista negra) {
if (err) {
retorno de chamada (err);
} else if (Blacklist) {
var currentDate = date.now ();
if (Blacklist.forbiddendeGee === 1 && BlackList.expireTime> CurrentDate) {
RemoneBlackListByip (IP, function (err) {
if (err) {
retorno de chamada (err);
}outro{
retorno de chamada (nulo, falso);
}
})
}outro{
retorno de chamada (nulo, verdadeiro);
}
}outro{
retorno de chamada (nulo, falso);
}
})
}
/**
* Obtenha a entrada da lista negra através do IP
* @param ip
* @param retorno de chamada
*/
var getBlackListByip = function (ip, retorno de chamada) {
Blacklist.findone ({ip: ip}, retorno de chamada);
}
/**
* Exclua a lista negra de acordo com o IP
* @param ip
* @param retorno de chamada
*/
var remoTBlackListByip = function (IP, retorno de chamada) {
getBlackListByip (IP, função (err, lista negra) {
if (err) {
retorno de chamada (err);
} else if (Blacklist) {
Blacklist.Remove (retorno de chamada);
}outro{
retorno de chamada (nulo, nulo);
}
})
}
exports.newandSave = newandSave;
exports.isinblacklist = isinblacklist;
exports.getBlackListByip = getBlackListByip;
exports.removeBlackListByip = RETROPTBLACKLISTBYIP;
exports.NewandSaveOneHourTempFORBIDDDEN = newandSaveOneHourTempFurbidden;
exports.NewAndSaveOneDayTempforbidden = newandSaveOneDayTempforbidden;
exports.NewAndSaveForeverForbidden = newandSaveForeverforbidden;
exports.newandSaveTempFORBIDDDEN = newandSaveTempforbidden;
Detalhes do middleware:
A cópia do código é a seguinte:
/**
* Criado por YCXJ-Wanglihui em 2014/5/28.
*/
'Use rigoroso';
var BlackListProxy = requer ('../../ proxy'). BlackListPorXy;
var iPanswerLogProxy = requer ('../../ proxy'). ipanswerLogProxy;
var eventproxy = requer ('EventProxy');
/**
* Determine se eu preciso mover o IP para a lista negra
* @param req
* @param res
* @param a seguir
*/
var isneedmovetoblacklist = function (req, res, próximo) {
var ip = req.ip;
// julga se está na lista negra
requerNotinBlacklist (req, res, function () {
var ep = new EventProxy ();
Ep.Fail (Next);
Ep.all ('MinuteCount', 'HourCount', 'Daycount', Função (MinUteCount, HourCount, DayCount) {
if (minuteCount> 10) {
BlacklistProxy.NewandSaveOneHourTempFurbidden (IP, função (Err, Lista Negra) {
if (err) {
retornar a seguir (err);
}outro{
Return Res.send ('A submissão é muito frequente, tente novamente após 1 hora!');
}
});
} else if (hourcount> 100) {
BlacklistProxy.NewandSaveOneDAYTempFurbidden (IP, função (Err, Blacklist) {
if (err) {
retornar a seguir (err);
}outro{
Return Res.send ('Os envios são muito frequentes, tente novamente após 1 dia!');
}
})
} else if (DayCount> 1000) {
BlacklistProxy.NewandSaveOneDAYTempFurbidden (IP, função (Err, Blacklist) {
if (err) {
retornar a seguir (err);
}outro{
Return Res.send ('Os envios são muito frequentes, tente novamente após 1 dia!');
}
})
}outro{
retornar a seguir ();
}
})
IpanswerLogProxy.CountOneminUteanSwer (IP, Ep.done ('MinUteCount'));
IPanswerLogProxy.CountOneHouranswer (IP, Ep.done ('HourCount'));
IpanswerLogProxy.CountoneDayanswer (IP, Ep.done ('DayCount'));
});
}
/**
* O middleware exige que o IP não esteja na lista negra
* @param req
* @param res
* @param a seguir
*/
var requerNotinBlackList = function (req, res, seguinte) {
var ip = req.ip;
BlackListProxy.isinblacklist (IP, function (err, resultado) {
if (err) {
próximo (err);
} else if (resultado) {
Return Res.send ('Seu IP está proibido de enviar. Se você tiver alguma dúvida, entre em contato com [email protected]');
}outro{
próximo();
}
})
}
exports.isneedmovetoblacklist = isneedmovetoblacklist;
exports.requirenotinblacklist = requerNotinBlackLlist;
Use no roteamento:
A cópia do código é a seguinte:
// interface de envio da página da web
Router.Post ('/create', middleware.isneedmovetoblacklist, paperanswers.create);