【趣事】用 JavaScript 对抗 DDOS 攻击
【趣事】用 JavaScript 对抗 DDOS 攻击前言从一道面试题说起几年前我参加了一场前端面试面试官突然问我“如果让你用 JavaScript 写一个简单的 DDOS 防御工具你会怎么做”我愣了一下心想DDOS 攻击不是应该用防火墙、负载均衡这些后端工具吗JavaScript 这种运行在浏览器里的“玩具语言”能做什么后来我才发现这个问题其实藏着很多有趣的知识点。JavaScript 虽然不能直接防御服务器端的 DDOS但在客户端、在浏览器端它确实能做出一些巧妙的“反制”措施。今天我就带你从基础到进阶一步步探索这个有趣的话题。## 基础篇什么是 DDOS 攻击DDOSDistributed Denial of Service分布式拒绝服务攻击就像是一群坏蛋同时冲进一家超市把所有的购物车都抢走导致正常顾客无法购物。在互联网世界里攻击者会控制成千上万的“僵尸电脑”肉鸡向目标服务器发送海量请求直到服务器资源耗尽无法响应正常用户的请求。举个简单例子假设你的网站有一个搜索功能每次搜索都要查询数据库。如果攻击者用 10 万个浏览器同时发送搜索请求你的服务器很快就会崩溃。## 第一段代码创建一个简单的请求速率限制器JavaScript 可以在浏览器端实现一个“请求节流器”控制请求发送的频率。虽然这不能阻止攻击但可以保护用户自己不被“误伤”比如某些恶意脚本会频繁发送请求。javascript/** * 请求速率限制器 * 功能在指定时间窗口内限制请求次数 * 参数 * - maxRequests: 最大允许请求数 * - timeWindow: 时间窗口毫秒 */class RateLimiter { constructor(maxRequests 5, timeWindow 1000) { this.maxRequests maxRequests; // 每秒最多5次请求 this.timeWindow timeWindow; this.requestTimestamps []; // 记录每次请求的时间戳 } /** * 检查是否允许发送请求 * returns {boolean} true表示允许false表示拒绝 */ canSendRequest() { const now Date.now(); // 移除超出时间窗口的旧记录 this.requestTimestamps this.requestTimestamps.filter( timestamp now - timestamp this.timeWindow ); // 如果当前窗口内请求数未达上限允许请求 if (this.requestTimestamps.length this.maxRequests) { this.requestTimestamps.push(now); return true; } // 请求过于频繁拒绝 return false; } /** * 获取当前请求频率统计 * returns {object} 包含当前请求数和剩余时间 */ getStats() { const now Date.now(); const validRequests this.requestTimestamps.filter( timestamp now - timestamp this.timeWindow ); return { currentRequests: validRequests.length, maxRequests: this.maxRequests, remainingRequests: this.maxRequests - validRequests.length, timeWindow: this.timeWindow }; }}// 使用示例const limiter new RateLimiter(5, 1000); // 每秒最多5次请求// 模拟连续发送请求for (let i 0; i 10; i) { const allowed limiter.canSendRequest(); console.log(请求 ${i 1}: ${allowed ? ✅ 通过 : ❌ 被限制}); if (!allowed) { console.log(当前状态:, limiter.getStats()); }}这段代码虽然简单但它体现了防御 DDOS 的核心思想控制频率。在实际项目中我们可以将这个速率限制器挂载到 AJAX 请求发送前对用户的请求行为进行实时监控。## 进阶篇客户端验证码与行为分析仅仅限制频率还不够攻击者可能会用更复杂的脚本绕过。这时候就需要引入“行为验证”机制。常见的做法是让用户完成一个简单的任务比如点击按钮、拖拽滑块来证明“我是真人”。javascript/** * 基于行为分析的验证码系统 * 功能检测用户操作是否像“人类行为” * 原理人类点击有随机延迟机器人点击则非常规律 */class HumanVerification { constructor() { this.clickTimestamps []; // 记录点击时间戳 this.clickPositions []; // 记录点击位置 (x, y) this.verificationThreshold 0.7; // 人类行为概率阈值 } /** * 记录一次点击事件 * param {number} x - 点击位置的x坐标 * param {number} y - 点击位置的y坐标 */ recordClick(x, y) { this.clickTimestamps.push(Date.now()); this.clickPositions.push({ x, y }); // 只保留最近10次点击记录 if (this.clickTimestamps.length 10) { this.clickTimestamps.shift(); this.clickPositions.shift(); } } /** * 分析点击行为判断是否是真人 * returns {boolean} true表示像真人false表示像机器人 */ analyzeBehavior() { if (this.clickTimestamps.length 5) { return false; // 数据不足无法判断 } // 计算点击间隔的方差人类点击间隔变化较大 const intervals []; for (let i 1; i this.clickTimestamps.length; i) { intervals.push(this.clickTimestamps[i] - this.clickTimestamps[i-1]); } const mean intervals.reduce((a, b) a b, 0) / intervals.length; const variance intervals.reduce((sum, val) sum Math.pow(val - mean, 2), 0) / intervals.length; // 计算点击位置的变化率人类点击位置不会完全一致 const positions this.clickPositions; let positionVariation 0; for (let i 1; i positions.length; i) { const dx positions[i].x - positions[i-1].x; const dy positions[i].y - positions[i-1].y; positionVariation Math.sqrt(dx * dx dy * dy); } positionVariation / (positions.length - 1); // 结合两个指标计算人类概率 const humanScore (variance 100 ? 0.4 : 0) (positionVariation 20 ? 0.3 : 0); console.log(人类行为评分: ${humanScore.toFixed(2)} (阈值: ${this.verificationThreshold})); return humanScore this.verificationThreshold; } /** * 生成一个简单的验证挑战 * returns {string} 验证任务描述 */ createChallenge() { const challenges [ 请在5秒内点击页面上的红色按钮, 请将滑块拖到最右侧再松开, 请按顺序点击数字1、2、3 ]; return challenges[Math.floor(Math.random() * challenges.length)]; }}// 使用示例const verifier new HumanVerification();// 模拟人类用户点击console.log(模拟人类点击行为...);verifier.recordClick(100, 200);setTimeout(() verifier.recordClick(150, 220), 300);setTimeout(() verifier.recordClick(200, 180), 700);setTimeout(() verifier.recordClick(120, 250), 1200);setTimeout(() verifier.recordClick(180, 210), 1800);setTimeout(() { const isHuman verifier.analyzeBehavior(); console.log(判断结果: ${isHuman ? ✅ 是真人 : ❌ 可能是机器人}); console.log(验证挑战: ${verifier.createChallenge()});}, 2000);这段代码展示了一个有趣的思路通过分析用户的点击间隔和位置变化判断“行为模式”是否像人类。真实的 DDOS 防御系统会结合更多维度的数据比如鼠标移动轨迹、页面滚动速度、甚至键盘输入节奏。## 深入探索Web Workers 与请求分发当攻击请求量巨大时主线程可能会被阻塞。这时候我们可以利用 Web Workers 在后台线程处理请求过滤避免影响页面正常交互。javascript// worker.js - 在后台线程运行的请求过滤逻辑self.onmessage function(event) { const requestData event.data; // 简单的请求验证逻辑 function validateRequest(data) { // 检查请求间隔 const now Date.now(); if (data.lastRequestTime (now - data.lastRequestTime 50)) { return { allowed: false, reason: 请求过于频繁 }; } // 检查请求来源简单的IP伪造检测 if (data.userAgent data.userAgent.includes(bot)) { return { allowed: false, reason: 疑似自动化工具 }; } // 通过验证 return { allowed: true, reason: 正常请求 }; } const result validateRequest(requestData); self.postMessage(result);};// 主线程 - 创建Worker并发送请求const worker new Worker(worker.js);const requestQueue [];function sendFilteredRequest(url, data) { return new Promise((resolve, reject) { worker.onmessage function(event) { const result event.data; if (result.allowed) { // 通过验证实际发送请求 fetch(url, { method: POST, body: JSON.stringify(data), headers: { Content-Type: application/json } }) .then(response resolve(response)) .catch(error reject(error)); } else { reject(new Error(result.reason)); } }; worker.postMessage({ userAgent: navigator.userAgent, lastRequestTime: Date.now(), ...data }); });}// 使用示例async function testWorkerFilter() { try { const response await sendFilteredRequest(/api/data, { key: value }); console.log(请求成功:, response); } catch (error) { console.error(请求被拦截:, error.message); }}## 总结通过这篇文章我们从基础概念出发逐步探索了 JavaScript 在对抗 DDOS 攻击中的有趣应用。从简单的请求速率限制器到基于行为分析的验证码系统再到利用 Web Workers 进行后台过滤每一个技巧都展示了 JavaScript 在客户端安全领域的潜力。当然这些代码只是“趣味性”的尝试真正的 DDOS 防御需要结合后端、网络层、云防护等多层次手段。但通过这个项目我们可以学到-限流思想控制请求频率是防御的第一道防线-行为分析通过数据模式区分人类和机器-异步处理利用浏览器特性优化性能最后提醒一句学习这些技术是为了理解安全原理千万不要用来做坏事。真正的程序员会用技术保护世界而不是破坏它。希望这篇文章能激发你对网络安全和 JavaScript 潜力的更多思考

相关新闻

Java 征途:行者的地图

Java 征途:行者的地图

Java 征途:行者的地图 引言:从字节码到分布式,Java 的进化之路Java,这门诞生于 1995 年的编程语言,早已超越了“语言”的范畴,成为一套完整的生态系统。对于开发者而言,Java 的学习之旅就像一场…

2026/10/17 1:42:58 阅读更多 →
CC1010硬件同步与前置码检测:低功耗无线通信的可靠接收基石

CC1010硬件同步与前置码检测:低功耗无线通信的可靠接收基石

1. 项目概述在嵌入式无线通信的世界里,数据帧的可靠接收往往比发送更具挑战性。想象一下,你站在一个嘈杂的火车站,广播里断断续续地播放着车次信息,你必须从一片杂音中准确捕捉到“开往XX方向的列车即将进站”这句话的开头&#x…

2026/10/16 17:22:09 阅读更多 →
基于SVM与ANN的金属废料智能分拣系统设计与实现

基于SVM与ANN的金属废料智能分拣系统设计与实现

1. 项目背景与核心价值 在金属回收行业中,废弃金属的分类与等级判定一直是个技术难点。传统人工分拣方式效率低下且准确率难以保证,而市场上现有设备往往只能处理单一金属类型。我们团队开发的这套系统,通过结合支持向量机(SVM&am…

2026/10/17 4:41:55 阅读更多 →

最新新闻

PyTorch实战:猫狗图像分类从入门到部署

PyTorch实战:猫狗图像分类从入门到部署

1. 为什么猫狗分类是入门深度学习的“试金石”如果你刚接触深度学习,想找一个既能跑通完整流程、又不会一上来就被复杂工程劝退的项目,猫狗图像分类几乎是公认的最佳起点。它不像手写数字识别那样过于简单,也不像目标检测或图像分割那样涉及大…

2026/10/19 4:30:46 阅读更多 →
AI写作工具怎么选?六大平台榜单与智能改写实操指南

AI写作工具怎么选?六大平台榜单与智能改写实操指南

1. 榜单背后的真实需求:科研写作的四个坎先说我自己的感受:做科研的人,最难受的往往不是实验设计,也不是数据分析,而是“把话说清楚”。开题报告要讲逻辑,文献综述要讲立场,正文要讲证据&#x…

2026/10/19 4:30:46 阅读更多 →
逆向Lua 5.1字节码:luadec51反编译实战与二次开发

逆向Lua 5.1字节码:luadec51反编译实战与二次开发

简介:luadec51 是一款面向 Lua 5.1.x 的 Lua 反编译器,基于 Hisham Muhammad 的 luadec(针对 Lua 5.0.x)发展而来,采用与原版相同的免费许可证。它适合需要逆向分析 Lua 字节码、研究虚拟机指令或恢复丢失源码的开发者…

2026/10/19 4:30:46 阅读更多 →
open-code-review:从形式化到高效落地的Code Review实践指南

open-code-review:从形式化到高效落地的Code Review实践指南

1. 代码审查这件事,为什么这么多团队做不好代码审查(Code Review)在国内开发团队里是个挺微妙的话题。你说它不重要,几乎所有团队都认同它重要;你说它在认真做,真正能把 Review 做出价值的团队少之又少。很…

2026/10/19 4:30:46 阅读更多 →
开源代码审查工具 open-code-review 实战:从 Git diff 到规则引擎

开源代码审查工具 open-code-review 实战:从 Git diff 到规则引擎

1. 先搞清楚 open-code-review 到底解决什么问题1.1 从“人肉 review”的痛点说起做过一段时间小组负责人的朋友应该都有这种感觉:代码审查(Code Review)这件事,听着简单,做起来却特别消耗人。日常开发里最典型的一个场…

2026/10/19 4:30:46 阅读更多 →
智能座舱语音交互核心技术术语解析:从ASR到TTS的完整链路

智能座舱语音交互核心技术术语解析:从ASR到TTS的完整链路

智能座舱的发布会上,“语音交互”这几个字被反复提及,但真正看参数页和产品通稿时,满屏的ASR、NLU、AEC、TTS、唤醒率、误唤醒、全双工、可见即可说,说实话我刚接触那会儿也一头雾水。车载语音交互和手机上的语音助手完全是两码事…

2026/10/19 4:29:45 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →