feat(backend): 实施连接与数据层速率限制
为了增强服务的稳定性和安全性,防止滥用行为,本次提交引入了两个核心的速率限制和验证机制: 1. **连接层验证 (`onConnect`)** - **IP 速率限制**:在 `connectionValidator.js` 中实现。限制单个 IP 地址每分钟最多 20 次连接,超过限制将临时封禁 5 分钟,以防御暴力连接攻击。 - **反向 DNS (PTR) 检查**:要求所有公共网络连接必须具有有效的 PTR 记录,用于区分合法邮件服务器和僵尸网络。 2. **数据层验证 (`onData`)** - **发件人域速率限制**:在 `rateLimiter.js` 中实现。在邮件数据传输阶段,限制单个发件人域名每分钟最多发送 10 封邮件,超过限制的域名将被临时封禁 5 分钟,以防止单一来源的邮件泛滥。 **主要变更:** - 新增 `backend/connectionValidator.js`:处理连接时的 IP 速率限制和 PTR 验证。 - 新增 `backend/rateLimiter.js`:在 `onData` 阶段对发件人域名进行速率限制。 - 在 `backend/app.js` 的 `SMTPServer` 配置中集成了 `onConnect` 验证钩子。 - 在 `backend/saveEmail.js` 中调用速率限制器,并在超限时拒绝邮件。 - 更新日志模块 (`logger.js`, `db.js`),输出更清晰,并记录安全相关事件。 - 新增 `backend/SECURITY_POLICIES.md` 文档,详细说明所有安全策略和可配置参数。
This commit is contained in:
@@ -8,6 +8,7 @@ const { saveEmail } = require('./saveEmail');
|
||||
const emitter = require('./eventEmitter');
|
||||
const logger = require('./logger');
|
||||
const morgan = require('morgan');
|
||||
const { validateConnection } = require('./connectionValidator');
|
||||
|
||||
const app = express();
|
||||
const apiPort = 5182;
|
||||
@@ -162,8 +163,13 @@ server.listen(apiPort, () => {
|
||||
|
||||
// Configure and start SMTP server
|
||||
const smtpServer = new SMTPServer({
|
||||
secure: false, // Enable STARTTLS
|
||||
authOptional: true,
|
||||
disabledCommands: ['AUTH'],
|
||||
onConnect(session, callback) {
|
||||
logger.info('Connection received from', { remoteAddress: session.remoteAddress });
|
||||
return validateConnection(session, callback);
|
||||
},
|
||||
onData(stream, session, callback) {
|
||||
logger.info('Receiving email...', { session });
|
||||
saveEmail(stream)
|
||||
@@ -173,6 +179,10 @@ const smtpServer = new SMTPServer({
|
||||
})
|
||||
.catch(err => {
|
||||
logger.error('Error processing email:', err);
|
||||
// Check if the error is a rate limit error with a specific response code
|
||||
if (err.responseCode) {
|
||||
return callback(err);
|
||||
}
|
||||
callback(new Error('Failed to process email.'));
|
||||
});
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user