abuse_protection.js
2.65 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
'use strict';
const Router = require('koa-router');
const ApiCache = require('../../ci/api_cache');
const _ = require('lodash');
const {
MemcachedHost
} = require('../../models');
let r = new Router();
const defensive = {
index: async(ctx, next) => {
const regexp = /pc:limiter:faker:(.*)/;
const threshold = ctx.request.query.threshold || 100;
const limit = ctx.request.query.limit || 10;
let hosts = await MemcachedHost.findAll();
const selectedHosts = _.filter(hosts, host => {
const isCurrent = host.host === ctx.request.query.node;
if (isCurrent) {
host.isCurrent = true;
}
return isCurrent;
});
let results = await Promise.all(_.map(selectedHosts, (h) => {
return (new ApiCache(h.host)).find((key) => {
return regexp.test(key);
});
}));
let list = [];
if (results && results[0]) {
Object.keys(results[0]).forEach((key) => {
const index = results[0][key];
if (index > threshold) {
list.push({
ip: ((key) => {
const m = key.match(regexp);
return m && m.length > 0 ? m[1] : 'Unknown';
})(key),
index: index
})
}
});
}
list = _.orderBy(list, (item) => {
return item.index;
}, 'desc').slice(0, limit);
await ctx.render('action/abuse_protection', {
hosts: hosts,
list: list,
noData: list.length === 0,
threshold: threshold,
limit: limit
});
},
lock: async(ctx, next) => {
let hosts = await MemcachedHost.findAll();
await Promise.all(_.map(hosts, (h) => {
const key = `pc:limiter:${ctx.request.body.remoteIp}`,
value = 9999,
ttl = 60 * 60 * 8; // 封停8小时
return (new ApiCache(h.host)).setKey(key, value, ttl);
}));
return ctx.body = {
code: 200
};
},
unlock: async(ctx, next) => {
let hosts = await MemcachedHost.findAll();
await Promise.all(_.map(hosts, (h) => {
const key = `pc:limiter:${ctx.request.body.remoteIp}`;
return (new ApiCache(h.host)).delKey(key);
}));
return ctx.body = {
code: 200
};
}
};
r.get('/abuse_protection', defensive.index);
r.post('/lock', defensive.lock);
r.post('/unlock', defensive.unlock);
module.exports = r;