블랙리스트 스키마 :
코드 사본은 다음과 같습니다.
/**
* 2014/5/28에 YCXJ-Wanglihui가 만들었습니다.
*/
'엄격한 사용';
var mongoose = 요구 ( 'mongoose');
var schema = mongoose.schema;
// 1. 단기 차단 2. 영구 차단
var Degree = {temp : 1, forever : 2};
/**
* 블랙리스트
* @type {schema}
*
* @param ip {String} BlackList IP
* @param createat {date} 생성 시간
* @param expiretime {date} 간단한 차단이라면 만료 시간을 차단하십시오.
* @param forbiddendegree {number} 차단 레벨 1. 단기 차단 2. 영구 차단
* @Param 이유 {string} 차단 이유
*/
var blacklist = 새로운 스키마 ({
IP : {
유형 : 문자열,
색인 : 참
},
createat : {
유형 : 날짜,
기본값 : 날짜
},
초기 : {
유형 : 날짜
},
금지 : {
유형 : 번호,
기본값 : 학위
},
이유:{
유형 : 문자열,
기본값 : '빈번한 요청'
}
});
mongoose.model ( '블랙리스트', 블랙리스트);
IP 및 제출 레코드 스키마 :
코드 사본은 다음과 같습니다.
/**
* 2014/5/28에 YCXJ-Wanglihui가 만들었습니다.
*/
'엄격한 사용';
var mongoose = 요구 ( 'mongoose');
var schema = mongoose.schema;
var 객체 = schema.objectid;
/**
* 설문지에 참여한 응답 기록 및 IP
* @type {schema}
*
* @param anspondid {objectid} Reply Id
* @param createat {date} 생성 시간
* @param ip {string} 답변 IP에 참여한 사람들
*/
var ipanswerlog = 새로운 스키마 ({
답변 : {
유형 : ObjectId
},
createat : {
유형 : 날짜,
기본값 : 날짜
},
IP : {
유형 : 문자열,
색인 : 참
}
});
mongoose.model ( 'ipanswerlog', ipanswerlog);
관련 프록시 코드 :
코드 사본은 다음과 같습니다.
/**
* 2014/5/28에 YCXJ-Wanglihui가 만들었습니다.
*/
'엄격한 사용';
var ipanswerlog = require ( '../ models'). ipanswerlog;
/**
* 생성 및 저장
* @param ipanswerlog {schema 또는 dict}
* @param 콜백
*/
var newandsave = function (ipanswerlog, 콜백) {
if (ipanswerlog instance of ipanswerlog) {
ipanswerlog.save (콜백);
}또 다른{
var m = 새로운 ipanswerlog (ipanswerlog);
M.Save (콜백);
}
}
/**
* 1 분 이내에 답변 수
* @param ip
* @param 콜백
*/
var countoneminuteanswer = function (ip, 콜백) {
var endtime = date.now ();
var begintime = endtime -1000*60*1;
CountipanswerbyTime (Begintime, EndTime, IP, Callback);
}
/**
* 1 시간 이내에 숫자에 답장하십시오
* @param ip
* @param 콜백
*/
var countonehouranswer = function (ip, 콜백) {
var endtime = date.now ();
var begintime = endtime -1000*60*60*1;
CountipanswerbyTime (Begintime, EndTime, IP, Callback);
}
/**
* 하루 안에 회신하십시오
* @param ip
* @param 콜백
*/
var countonedayanswer = function (ip, 콜백) {
var endtime = date.now ();
var begintime = endtime -1000*60*60*24;
CountipanswerbyTime (Begintime, EndTime, IP, Callback);
}
/**
* 일정 기간 내에 답장 수를 계산합니다.
* @param begintime {number} 시작 시간 스탬프 시작
* @param endtime {number} 종료 시간 null 인 경우 현재 시간 스탬프를 사용하십시오.
* @param ip {String} IP 주소
* @param 콜백
*/
var countipanswerbytime = 함수 (begintime, endtime, ip, 콜백) {
if (! endtime) {
endtime = date.now ();
}
ipanswerlog.count ({ip : ip, '$ and': {$ lt : begintime, $ gt : endtime}}, 콜백);
}
수출.
수출.
Exports.countonehouranswer = Countonehouranswer;
수출.
Exports.NewandSave = NewandSave;
블랙리스트 프록시 :
코드 사본은 다음과 같습니다.
/**
* 2014/5/28에 YCXJ-Wanglihui가 만들었습니다.
*/
'엄격한 사용';
var blacklist = require ( '../ models'). 블랙리스트;
/**
* 생성 및 저장
* @param 백리스트 {blacklist} 또는 {dict} 블랙리스트 데이터
* @param 콜백
*/
var newandsave = function (백리스트, 콜백) {
if (블랙리스트의 백리스트 인스턴스) {
백리스트 .Save (콜백);
}또 다른{
var m = 새로운 블랙리스트 (백리스트);
M.Save (콜백);
}
}
/**
* 1 시간 동안 IP 액세스를 비활성화합니다
* @param ip {String}
* @param 콜백
*/
var newandsaveonehourtempforbidden = function (ip, 콜백) {
var expiretime = date.now () + 1000*60*60;
NewandSavetempforbidden (IP, Expiretime, Callback);
}
/**
* 하루 동안 비활성화하십시오
* @param ip {String}
* @param 콜백
*/
var newandsaveonedaytempforbidden = function (ip, 콜백) {
var expiretime = date.now () + 1000*60*60*24;
NewandSavetempforbidden (IP, Expiretime, Callback);
}
/**
* 임시 블랙리스트를 만듭니다
* @param ip {String}
* @param expiretime {number} 만료 시간
* @param 콜백
*/
var newandsavetempforbidden = function (ip, expiretime, 콜백) {
var blacklist = new Blacklist ({ip : ip, expiretime : expiretime, forbiddendegree : 1});
NewandSave (블랙리스트, 콜백);
}
/**
* 영구 블랙리스트를 생성하고 저장하십시오
* @param ip
* @param 콜백
*/
var newandsaveforeverforbidden = function (ip, 콜백) {
var blacklist = new Blacklist ({ip : ip, forbiddendegree : 2});
NewandSave (블랙리스트, 콜백);
}
/**
* 블랙리스트에 있는지 확인하십시오
* @param ip {String} IP 주소
* @param 콜백
*/
var isinblacklist = function (ip, 콜백) {
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 remokBlackListByip = 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 = removeBlackListByip;
Exports.newandsaveonehourtempforbidden = Newandsaveonehourtempforbidden;
Exports.NewandsaveOneDayTempForbidden = NewandSaveOnEdayTempForbidden;
Exports.newandsaveforeververbidden = Newandsaveforeververvenden;
Exports.newandsavetempforbidden = NewandSavetemPforbidden;
미들웨어 세부 사항 :
코드 사본은 다음과 같습니다.
/**
* 2014/5/28에 YCXJ-Wanglihui가 만들었습니다.
*/
'엄격한 사용';
var blacklistproxy = require ( '../../ proxy'). BlackListporxy;
var ipanswerlogproxy = 요구 ( '../../ proxy'). ipanswerlogproxy;
var eventProxy = require ( 'eventProxy');
/**
* IP를 블랙리스트로 이동 해야하는지 결정
* @param req
* @param res
* @param 다음
*/
var isneedMovetoBlackList = function (req, res, next) {
var ip = req.ip;
// 블랙리스트에 있는지 판단합니다
요구 사항 이네 노틴 블랙리스트 (Req, Res, function () {
var ep = 새로운 eventProxy ();
ep.fail (다음);
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 일 후에 다시 시도하십시오!');
}
})
}또 다른{
반환 다음 ();
}
})
ipanswerlogproxy.countoneminuteanswer (ip, ep.done ( 'minutecount'));
ipanswerlogproxy.countonehouranswer (ip, ep.done ( 'HourCount'));
ipanswerlogproxy.countoneDayanswer (ip, ep.done ( 'daycount'));
});
}
/**
* 미들웨어는 IP가 블랙리스트에 있지 않아야합니다.
* @param req
* @param res
* @param 다음
*/
var requiredeNotInBlackList = function (req, res, next) {
var ip = req.ip;
BlackListProxy.isinBlackList (ip, function (err, result) {
if (err) {
다음 (err);
} else if (result) {
Return Res.Send ( 'IP는 제출 할 수 없습니다. 질문이 있으시면 [email protected]')에 문의하십시오);
}또 다른{
다음();
}
})
}
exports.isneedMovetoBlackList = isneedMovetoBlackList;
Exports.RequirenotinBlacklist = DearkeEnotinBlacklist;
라우팅에서 사용 :
코드 사본은 다음과 같습니다.
// 웹 페이지 제출 인터페이스
router.post ( '/create', middleware.isneedMovetoBlackList, paperAnswers.create);