Schéma de liste noire:
La copie de code est la suivante:
/ **
* Créé par YCXJ-Wanglihui le 2014/5/28.
* /
«utiliser strict»;
var mongoose = require ('Mongoose');
var schéma = mongoose.schema;
// 1. Blocage à court terme 2. Blocage permanent
var degré = {temp: 1, pour toujours: 2};
/ **
* Liste noire
* @Type {Schema}
*
* @param ip {String} noire de liste noire
* @param CreateEat {date} Heure de création
* @param Expiretime {Date} S'il s'agit d'un bref blocage, bloquez l'heure d'expiration
* @param interddendenEgree {nombre} Blocking Niveau 1. Blocage à court terme 2. Blocage permanent
* @param raison {String} Raison de blocage
* /
var BlackList = nouveau schéma ({
ip: {
Type: chaîne,
Index: vrai
},
CreateEat: {
Type: date,
par défaut: date.
},
Expiration: {
Type: date
},
ForbidDendegree: {
Type: numéro,
Par défaut: degré.Temp
},
raison:{
Type: chaîne,
par défaut: «Demandes fréquentes»
}
});
Mongoose.Model ('Blacklist', Blacklist);
IP et schéma d'enregistrement de soumission:
La copie de code est la suivante:
/ **
* Créé par YCXJ-Wanglihui le 2014/5/28.
* /
«utiliser strict»;
var mongoose = require ('Mongoose');
var schéma = mongoose.schema;
var ObjectId = schema.ObjectId;
/ **
* Enregistrer les réponses et la propriété intellectuelle de la participation au questionnaire
* @Type {Schema}
*
* @param réponses {objectId} ID de réponse
* @param CreateEat {date} Heure de création
* @param ip {String} des gens qui ont participé à la réponse ip
* /
var ipanswerlog = nouveau schéma ({{
ResponseId: {
Type: ObjectId
},
CreateEat: {
Type: date,
par défaut: date.
},
ip: {
Type: chaîne,
Index: vrai
}
});
Mongoose.Model ('ipanswerlog', ipanswerlog);
Code proxy connexe:
La copie de code est la suivante:
/ **
* Créé par YCXJ-Wanglihui le 2014/5/28.
* /
«utiliser strict»;
var ipanswerlog = require ('../ modèles'). ipanswerlog;
/ **
* Créer et enregistrer
* @param ipanswerlog {schéma ou dict}
* rappel @param
* /
var newandsave = fonction (ipanswerlog, rappel) {
if (ipanswerlog instanceof ipanswerlog) {
ipanswerlog.save (rappel);
}autre{
var m = new ipanswerlog (ipanswerlog);
M.Save (rappel);
}
}
/ **
* Nombre de réponses en une minute
* @param ip
* rappel @param
* /
var countonemInuteanswer = fonction (ip, rappel) {
var endtime = date.Now ();
var begintime = fin - 1000 * 60 * 1;
CountipanswerBytime (Begintime, Endtime, IP, rappel);
}
/ **
* Répondre aux chiffres dans une heure
* @param ip
* rappel @param
* /
var countonehouranswer = fonction (ip, rappel) {
var endtime = date.Now ();
var begintime = fin - 1000 * 60 * 60 * 1;
CountipanswerBytime (Begintime, Endtime, IP, rappel);
}
/ **
* Répondre dans un jour
* @param ip
* rappel @param
* /
var countonedayanswer = fonction (ip, rappel) {
var endtime = date.Now ();
var begintime = fin - 1000 * 60 * 60 * 24;
CountipanswerBytime (Begintime, Endtime, IP, rappel);
}
/ **
* Calculez le nombre de réponses dans une certaine période
* @param begintime {numéro} Dédition d'heure de début
* @param Fintime {nombre} Heure de fin Si null, utilisez le stamp de temps actuel
* @param ip {String} adresse IP
* rappel @param
* /
var countipanswerbytime = function (begintime, fin, ip, rappel) {
if (! Fintime) {
EndTime = Date.Now ();
}
Ipanswerlog.count ({ip: ip, '$ et': {$ lt: begintime, $ gt: endtime}}, rappel);
}
exports.countIpanswerBytime = countipanswerbytime;
export.CountonEdayanswer = couNoneDayanswer;
export.CountOneHouranswer = countoneHouranswer;
exports.CountonEMinUteansWer = CounonEminuteanSwer;
export.newandsave = newandsave;
Proxy de liste noire:
La copie de code est la suivante:
/ **
* Créé par YCXJ-Wanglihui le 2014/5/28.
* /
«utiliser strict»;
var BlackList = require ('../ modèles'). BlackList;
/ **
* Créer et enregistrer
* @param backlist {Blacklist} ou {dict} Données de liste noire
* rappel @param
* /
var newandsave = fonction (backlist, callback) {
if (instance backlist de BlackList) {
backList.save (rappel);
}autre{
var m = new BlackList (backlist);
M.Save (rappel);
}
}
/ **
* Désactiver l'accès IP pendant une heure
* @param ip {String}
* rappel @param
* /
var newandsaveOneHourTempForbidDend = fonction (ip, rappel) {
var Expiretime = date.now () + 1000 * 60 * 60;
newandsAvetempForbidden (ip, expirément, rappel);
}
/ **
* Désactiver pendant une journée
* @param ip {String}
* rappel @param
* /
var newandsaveonedayTempForbidden = function (ip, rappel) {
var Expiretime = Date.Now () + 1000 * 60 * 60 * 24;
newandsAvetempForbidden (ip, expirément, rappel);
}
/ **
* Créer une liste noire temporaire
* @param ip {String}
* @param Expiretime {nombre} Temps d'expiration
* rappel @param
* /
var newandsAvetempForBidden = function (ip, expirtime, rappel) {
var BlackList = new BlackList ({ip: ip, expiretime: Expiretime, ForbidDendegree: 1});
Newandsave (Blacklist, rappel);
}
/ **
* Créez et enregistrez une liste noire permanente
* @param ip
* rappel @param
* /
var newandsaveforeverforbidden = fonction (ip, rappel) {
var BlackList = new BlackList ({ip: ip, ForbidDendegree: 2});
Newandsave (Blacklist, rappel);
}
/ **
* Déterminez s'il est sur la liste noire
* @param ip {String} adresse IP
* rappel @param
* /
var isInBlackList = function (ip, rappel) {
getBlackListByip (ip, fonction (err, BlackList) {
if (err) {
rappel (err);
} else if (Blacklist) {
var currentDate = date.now ();
if (BlackList.forbidDendegree === 1 && BlackList.Expiretime> CurrentDate) {
retireblackListByip (ip, fonction (err) {
if (err) {
rappel (err);
}autre{
rappel (null, false);
}
})
}autre{
rappel (null, true);
}
}autre{
rappel (null, false);
}
})
}
/ **
* Obtenez une entrée de liste noire via IP
* @param ip
* rappel @param
* /
var getBlackListByip = fonction (ip, rappel) {
BlackList.FindOne ({ip: ip}, rappel);
}
/ **
* Supprimer la liste noire selon IP
* @param ip
* rappel @param
* /
var discountBlackListByip = fonction (ip, rappel) {
getBlackListByip (ip, fonction (err, BlackList) {
if (err) {
rappel (err);
} else if (Blacklist) {
BlackList.Remove (rappel);
}autre{
rappel (null, null);
}
})
}
export.newandsave = newandsave;
export.isinblacklist = IsInBlackList;
Exports.getBlackListByip = getBlackListByip;
export.reMoveBlackListByip = removeBlackListByip;
exports.NewandsAveoneHourTempForBidden = newandsaveOneHourTempForBidden;
exports.newandsaveonedayTempForBidden = newandsaveonedayTempForBidden;
export.newandsaveforeverForbidden = newandsaveforeverForbidden;
exports.newandsavetempForbidden = newandsAvetempForBidden;
Détails du middleware:
La copie de code est la suivante:
/ **
* Créé par YCXJ-Wanglihui le 2014/5/28.
* /
«utiliser strict»;
var BlackListProxy = require ('../../ proxy'). BlackListporxy;
var ipanswerLogProxy = require ('../../ proxy'). ipanswerLogProxy;
var eventProxy = require ('eventProxy');
/ **
* Déterminez si j'ai besoin de déplacer l'IP vers la liste noire
* @param req
* @param res
* @param suivant
* /
var isNeedMovetOblackList = function (req, res, suivant) {
var ip = req.ip;
// juger si c'est sur la liste noire
BesoinToInBlackList (req, res, function () {
var ep = new EventProxy ();
ep.fail (suivant);
ep.all ('minUteCount', 'hourcount', 'daycount', function (minUteCount, hourcount, dayCount) {
if (minUteCount> 10) {
BlackListProxy.NewandsAveOneHourTempForBidden (IP, fonction (err, Blacklist) {
if (err) {
return net (err);
}autre{
return res.send («La soumission est trop fréquente, réessayez après 1 heure!»);
}
});
} else if (hourcount> 100) {
BlackListProxy.NewandsAveoneDayTempForBidden (IP, fonction (err, BlackList) {
if (err) {
return net (err);
}autre{
return res.send («Les soumissions sont trop fréquentes, réessayez après 1 jour!»);
}
})
} else if (dayCount> 1000) {
BlackListProxy.NewandsAveoneDayTempForBidden (IP, fonction (err, BlackList) {
if (err) {
return net (err);
}autre{
return res.send («Les soumissions sont trop fréquentes, réessayez après 1 jour!»);
}
})
}autre{
return next ();
}
})
IpanswerLogProxy.CountonEMinUteanSwer (ip, ep.done ('minUteCount'));
IpanswerLogProxy.CountOneHouranswer (ip, ep.done ('hourCount'));
IpanswerLogProxy.CountOneDayanswer (ip, ep.done ('dayCount'));
});
}
/ **
* Middleware exige que l'IP ne soit pas sur la liste noire
* @param req
* @param res
* @param suivant
* /
var exiquisenotinblackList = function (req, res, suivant) {
var ip = req.ip;
BlackListProxy.isinBlackList (IP, fonction (err, result) {
if (err) {
suivant (err);
} else if (résultat) {
return res.send («Votre IP est interdite de soumettre. Si vous avez des questions, veuillez contacter [email protected]»);
}autre{
suivant();
}
})
}
export.isneedmovetoblackList = isNeedMovetOblackList;
export.requireNoInBlackList = BesiBoInBlackList;
Utilisation dans le routage:
La copie de code est la suivante:
// Interface de soumission de la page Web
Router.Post ('/ Create', middleware.isneedmovetoblacklist, PaperAnswers.Create);