Skema Blacklist:
Salinan kode adalah sebagai berikut:
/**
* Dibuat oleh ycxj-wanglihui pada 2014/5/28.
*/
'Gunakan ketat';
var mongoose = membutuhkan ('mongoose');
var skema = mongoose.schema;
// 1. Pemblokiran jangka pendek 2. Pemblokiran permanen
var derajat = {temp: 1, forever: 2};
/**
* Daftar hitam
* @type {skema}
*
* @param ip {string} blacklist ip
* @param createat {date} waktu penciptaan
* @param Expiretime {date} Jika itu adalah pemblokiran singkat, blokir waktu kedaluwarsa
* @param ForbidDendegree {number} level blocking 1. Pemblokiran jangka pendek 2. Pemblokiran permanen
* @param Reason {String} Reason Blocking
*/
var blacklist = skema baru ({
aku p:{
Ketik: String,
Indeks: Benar
},
createat: {
Jenis: Tanggal,
Default: Date.Now
},
EXPIRETIME: {
Jenis: Tanggal
},
ForbidDendegree: {
Jenis: Nomor,
Default: DEGARE.TEMP
},
alasan:{
Ketik: String,
Default: 'Permintaan Sering'
}
});
Mongoose.model ('Blacklist', Blacklist);
Skema catatan IP dan pengiriman:
Salinan kode adalah sebagai berikut:
/**
* Dibuat oleh ycxj-wanglihui pada 2014/5/28.
*/
'Gunakan ketat';
var mongoose = membutuhkan ('mongoose');
var skema = mongoose.schema;
var ObjectId = schema.objectId;
/**
* Rekam tanggapan dan IP berpartisipasi dalam kuesioner
* @type {skema}
*
* @param answerid {ObjectId} ID Balas
* @param createat {date} waktu penciptaan
* @param ip {string} orang yang berpartisipasi dalam balasan IP
*/
var ipanswerlog = skema baru ({
Jawaban: {
Jenis: ObjectID
},
createat: {
Jenis: Tanggal,
Default: Date.Now
},
aku p:{
Ketik: String,
Indeks: Benar
}
});
mongoose.model ('ipanswerlog', ipanswerlog);
Kode proxy terkait:
Salinan kode adalah sebagai berikut:
/**
* Dibuat oleh ycxj-wanglihui pada 2014/5/28.
*/
'Gunakan ketat';
var ipanswerlog = membutuhkan ('../ model'). ipanswerlog;
/**
* Buat dan simpan
* @param ipanswerlog {skema atau dikt}
* @param callback
*/
var newandsave = fungsi (ipanswerlog, callback) {
if (ipanswerlog instance dari ipanswerlog) {
ipanswerlog.save (callback);
}kalau tidak{
var m = ipanswerlog baru (ipanswerlog);
m.save (callback);
}
}
/**
* Jumlah balasan dalam satu menit
* @param IP
* @param callback
*/
var countoneminuteanswer = function (ip, callback) {
var endtime = date.now ();
var beginTime = endtime - 1000*60*1;
Countipanswerbytime (BeginTime, Endtime, IP, Callback);
}
/**
* Balas nomor dalam satu jam
* @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);
}
/**
* Balas dalam satu hari
* @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);
}
/**
* Hitung jumlah balasan dalam periode waktu tertentu
* @param begintime {angka} stempel waktu mulai
* @param endtime {angka} waktu akhir jika null, gunakan stempel waktu saat ini
* @param ip {string} alamat IP
* @param callback
*/
var countipanswerbytime = function (begintime, endtime, ip, callback) {
if (! endtime) {
endtime = date.now ();
}
Ipanswerlog.count ({ip: ip, '$ and': {$ lt: beginTime, $ gt: endtime}}, callback);
}
Exports.counttipanswerbytime = countipanswerbytime;
Exports.CountonedAyAnswer = countonedayanswer;
Exports.CountOneHouranswer = CountOneHouranswer;
ekspor.countoneminuteanswer = countoneminuteanswer;
ekspors.newandsave = newandsave;
Proxy Blacklist:
Salinan kode adalah sebagai berikut:
/**
* Dibuat oleh ycxj-wanglihui pada 2014/5/28.
*/
'Gunakan ketat';
var blacklist = membutuhkan ('../ model'). Blacklist;
/**
* Buat dan simpan
* @param backlist {blacklist} atau {Dict} data BlackList
* @param callback
*/
var newandsave = function (backlist, callback) {
if (instance backlist dari blacklist) {
backlist.save (callback);
}kalau tidak{
var m = new blacklist (backlist);
m.save (callback);
}
}
/**
* Nonaktifkan akses IP selama satu jam
* @param ip {string}
* @param callback
*/
var newandsaveoneHourtempForbidden = function (ip, callback) {
var EXPIRETIME = Date.Now () + 1000*60*60;
newandsavetempForbidden (IP, kedaluwarsa, panggilan balik);
}
/**
* Nonaktifkan untuk satu hari
* @param ip {string}
* @param callback
*/
var newandsaveonedaytempforbidden = function (ip, callback) {
var EXPIRETIME = Date.Now () + 1000*60*60*24;
newandsavetempForbidden (IP, kedaluwarsa, panggilan balik);
}
/**
* Buat daftar hitam sementara
* @param ip {string}
* @param Expiretime {number} waktu kedaluwarsa
* @param callback
*/
var newandsaveTempForbidden = function (ip, preperseetime, callback) {
var blacklist = new blacklist ({ip: ip, kedaluwarsa: kedaluwarsa, forbiddendegree: 1});
Newandsave (daftar hitam, panggilan balik);
}
/**
* Buat dan simpan daftar hitam permanen
* @param IP
* @param callback
*/
var newandsaveforeverforbidden = function (ip, callback) {
var blacklist = new blacklist ({ip: ip, forbiddendegree: 2});
Newandsave (daftar hitam, panggilan balik);
}
/**
* Tentukan apakah itu ada di daftar hitam
* @param ip {string} alamat IP
* @param callback
*/
var isInblackList = function (ip, callback) {
getBlackListByIp (ip, function (err, blacklist) {
if (err) {
callback (err);
} lain jika (blacklist) {
var currentDate = date.now ();
if (blacklist.forbiddendegree === 1 && blacklist.expiretime> currentDate) {
hapusBlackListByIp (ip, function (err) {
if (err) {
callback (err);
}kalau tidak{
callback (null, false);
}
})
}kalau tidak{
callback (null, true);
}
}kalau tidak{
callback (null, false);
}
})
}
/**
* Dapatkan entri daftar hitam melalui IP
* @param IP
* @param callback
*/
var getBlackListByIp = function (ip, callback) {
Blacklist.findone ({ip: ip}, callback);
}
/**
* Hapus daftar hitam menurut IP
* @param IP
* @param callback
*/
var RemestBlackListByIp = function (ip, callback) {
getBlackListByIp (ip, function (err, blacklist) {
if (err) {
callback (err);
} lain jika (blacklist) {
BlackList.Remove (Callback);
}kalau tidak{
callback (null, null);
}
})
}
ekspors.newandsave = newandsave;
ekspors.isinblacklist = isinblacklist;
Exports.getBlackListByIp = getBlackListByIp;
Exports.RemoveBlackListByIp = RemoveBlackListByIP;
Exports.NewandSaveOneHourtempForbidden = newandsaveoneHourtempForbidden;
Exports.NewandSaveOndayTempForbidden = NewandsaveOndaytempForbidden;
Exports.NewandSaveForeverForbidden = newandsaveForeverForbidden;
Exports.newandsavetempForbidden = newandsavetempForbidden;
Detail middleware:
Salinan kode adalah sebagai berikut:
/**
* Dibuat oleh ycxj-wanglihui pada 2014/5/28.
*/
'Gunakan ketat';
var blacklistproxy = membutuhkan ('../../ proxy'). Blacklistporxy;
var ipanswerlogproxy = membutuhkan ('../../ proxy'). IpanswerLogProxy;
var eventproxy = membutuhkan ('eventproxy');
/**
* Tentukan apakah saya perlu memindahkan IP ke daftar hitam
* @param req
* @param res
* @param Next
*/
var isNeedMovetoBlackList = function (req, res, next) {
var ip = req.ip;
// menilai apakah itu ada di daftar hitam
membutuhkanenotinblacklist (req, res, function () {
var ep = new EventProxy ();
Ep.fail (berikutnya);
ep.all ('minutecount', 'hourcount', 'daycount', function (minutecount, hourcount, daycount) {
if (minutecount> 10) {
Blacklistproxy.newandsaveOneHourtempForbidden (ip, function (err, blacklist) {
if (err) {
kembali selanjutnya (err);
}kalau tidak{
return res.send ('kiriman terlalu sering, coba lagi setelah 1 jam!');
}
});
} lain jika (hourcount> 100) {
BlackListProxy.NewandSaveOndayTempForbidden (IP, Function (err, BlackList) {
if (err) {
kembali selanjutnya (err);
}kalau tidak{
return res.send ('kiriman terlalu sering, coba lagi setelah 1 hari!');
}
})
} lain jika (daycount> 1000) {
BlackListProxy.NewandSaveOndayTempForbidden (IP, Function (err, BlackList) {
if (err) {
kembali selanjutnya (err);
}kalau tidak{
return res.send ('kiriman terlalu sering, coba lagi setelah 1 hari!');
}
})
}kalau tidak{
kembali selanjutnya ();
}
})
Ipanswerlogproxy.countoneminuteanswer (ip, ep.done ('minutecount'));
Ipanswerlogproxy.countOneHouranswer (ip, ep.done ('hourcount'));
Ipanswerlogproxy.countonedayanswer (ip, ep.done ('daycount'));
});
}
/**
* Middleware mengharuskan IP tidak ada di daftar hitam
* @param req
* @param res
* @param Next
*/
var membutuhkanenotinblacklist = function (req, res, next) {
var ip = req.ip;
Blacklistproxy.isinblacklist (ip, function (err, hasil) {
if (err) {
Berikutnya (err);
} lain jika (hasil) {
return res.send ('IP Anda dilarang mengirimkan. Jika Anda memiliki pertanyaan, silakan hubungi [email protected]');
}kalau tidak{
Berikutnya();
}
})
}
Exports.isneedMovetoBlackList = isNeedMovetoBlackList;
Exports.RequireNotinBlackList = membutuhkanenotinblacklist;
Gunakan dalam Routing:
Salinan kode adalah sebagai berikut:
// Antarmuka pengiriman halaman web
router.post ('/create', middleware.isneedmovetoBlacklist, parananswers.create);