TL;DR
Разбираем создание кастомного NPM-пакета для real-time верификации email, защиты от спама и фрод-ботов. Вместо подключения тяжелых сторонних решений - легковесный модуль с MX-рекордами проверкой и базой disposable-почт. Пример реализации на Node.js + React для dashboard.
Введение: контекст и актуальность
В современных веб-приложениях проблема спама и фрода стоит особенно остро. Типичные решения вроде reCAPTCHA или сторонних API:
- Добавляют latency
- Усложняют архитектуру
- Требуют работы с external rate limits
Мы разберем альтернативу - кастомный модуль veripy-sdk, который:
- Проверяет MX-записи в реальном времени
- Сверяется с базой 100k+ disposable-почт
- Предоставляет admin dashboard для мониторинга
Основная часть: архитектура решения
Ядро: валидация MX-записей
// core/verifyMX.js
import dns from 'dns/promises';
export async function verifyEmailMX(email) {
const domain = email.split('@')[1];
try {
const records = await dns.resolveMx(domain);
return records.length > 0;
} catch {
return false;
}
}
Disposable-база: bloom filter для оптимизации
Вместо хранения 100k+ записей в памяти используем probabilistic data structure:
// core/disposableFilter.js
import { BloomFilter } from 'bloom-filters';
const disposableDomains = ['tempmail.com', '10minutemail.net' /* ... */];
const filter = BloomFilter.from(disposableDomains, 0.01); // 1% false positive
export function isDisposable(email) {
const domain = email.split('@')[1];
return filter.has(domain);
}
Композитная проверка
// index.js
export async function verifyEmail(email) {
const [validMX, isDisposable] = await Promise.all([
verifyEmailMX(email),
isDisposable(email),
]);
return {
valid: validMX && !isDisposable,
reasons: {
invalidMX: !validMX,
disposable: isDisposable,
},
};
}
Практическое применение
Интеграция с фронтендом
- Устанавливаем пакет:
npm install veripy-sdk
- Real-time проверка в форме:
import { verifyEmail } from 'veripy-sdk';
function EmailForm() {
const [validation, setValidation] = useState(null);
const handleChange = debounce(async (email) => {
const result = await verifyEmail(email);
setValidation(result);
}, 500);
return (
<>
<input type="email" onChange={(e) => handleChange(e.target.value)} />
{validation && !validation.valid && (
<div className="error">
{validation.reasons.invalidMX && 'Invalid email domain'}
{validation.reasons.disposable && 'Disposable email not allowed'}
</div>
)}
</>
);
}
Admin Dashboard
Реализация на Next.js + WebSockets для real-time мониторинга:
// pages/dashboard.js
import { useEffect, useState } from 'react';
import io from 'socket.io-client';
export default function Dashboard() {
const [logs, setLogs] = useState([]);
useEffect(() => {
const socket = io(process.env.NEXT_PUBLIC_WS_URL);
socket.on('email_verified', (data) => {
setLogs(prev => [data, ...prev.slice(0, 100)]);
});
return () => socket.disconnect();
}, []);
return (
<div>
{logs.map(log => (
<LogEntry key={log.timestamp} {...log} />
))}
</div>
);
}
Заключение
Представленное решение демонстрирует, что critical security-функционал можно реализовать:
- Без тяжелых зависимостей
- С минимальной latency
- С возможностью кастомизации под бизнес-правила
Для production-рекомендаций стоит добавить:
- Rate limiting на уровне nginx
- Периодическое обновление disposable-базы
- Интеграцию с SMTP для deep-валидации
Готовое решение: veripy-sdk (документация в README).