DDoS(分布式拒绝服务)攻击是非法行为,对任何网站或服务器进行未经授权的DDoS攻击都是严重的网络犯罪,会导致严厉的法律后果,本源码仅用于学习、研究和合法的压力测试目的,例如测试自己拥有的服务器的抗攻击能力。严禁用于任何非法活动。

(图片来源网络,侵删)
这个项目将是一个简单的网页端应用,主要功能包括:
- 用户注册/登录:用户需要账户才能购买和使用服务。
- 服务套餐展示:展示不同时长的DDoS压力测试套餐。
- 卡密生成与管理:管理员可以生成新的卡密,并将其与套餐关联。
- 用户兑换:用户使用卡密兑换对应的套餐时长。
- 用户面板:用户查看自己剩余的测试时长。
我们将使用以下技术栈:
- 前端: HTML, CSS, JavaScript (原生)
- 后端: Python (Flask 框架,轻量且易于上手)
- 数据库: SQLite (简单,无需额外配置,适合小型项目)
第一步:项目结构
创建一个项目文件夹,ddos_panel,并在其中创建以下文件和子目录:
ddos_panel/
├── app.py # Flask 应用主文件
├── config.py # 配置文件
├── database.py # 数据库模型和初始化
├── templates/ # HTML 模板文件
│ ├── base.html
│ ├── index.html
│ ├── login.html
│ ├── register.html
│ ├── admin.html
│ └── user_panel.html
├── static/ # 静态文件 (CSS, JS)
│ └── style.css
├── instance/ # SQLite 数据库文件将存放在这里
└── README.md # 项目说明文件
第二步:后端实现
安装依赖
您需要安装 Flask 和 Flask-Login,打开终端,运行:

(图片来源网络,侵删)
pip install Flask Flask-Login
database.py - 数据库模型
这个文件定义了数据库中的表结构:用户、套餐和卡密。
# database.py
import os
from flask_sqlalchemy import SQLAlchemy
# 获取 instance 文件的绝对路径
basedir = os.path.abspath(os.path.dirname(__file__))
db = SQLAlchemy()
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
password_hash = db.Column(db.String(120), nullable=False)
# 用户剩余的测试时长(秒)
remaining_time = db.Column(db.Integer, default=0)
is_admin = db.Column(db.Boolean, default=False)
class Plan(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(100), nullable=False) # e.g., "1小时套餐"
duration = db.Column(db.Integer, nullable=False) # e.g., 3600 (seconds)
class Card(db.Model):
id = db.Column(db.Integer, primary_key=True)
code = db.Column(db.String(64), unique=True, nullable=False)
is_used = db.Column(db.Boolean, default=False)
plan_id = db.Column(db.Integer, db.ForeignKey('plan.id'), nullable=False)
used_by_user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=True)
used_at = db.Column(db.DateTime, nullable=True)
plan = db.relationship('Plan', backref=db.backref('cards', lazy=True))
user = db.relationship('User', backref=db.backref('used_cards', lazy=True))
app.py - Flask 应用主逻辑
这是整个应用的核心,处理路由和业务逻辑。
# app.py
import os
import secrets
from datetime import datetime
from flask import Flask, render_template, request, redirect, url_for, flash, session
from flask_login import LoginManager, UserMixin, login_user, logout_user, login_required, current_user
from werkzeug.security import generate_password_hash, check_password_hash
from database import db, User, Plan, Card
# 初始化 Flask 应用
app = Flask(__name__)
app.config['SECRET_KEY'] = secrets.token_hex(16) # 用于 session 加密
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(app.instance_path, 'ddos_panel.sqlite')
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# 确保实例文件夹存在
os.makedirs(app.instance_path, exist_ok=True)
# 初始化数据库和登录管理器
db.init_app(app)
login_manager = LoginManager(app)
login_manager.login_view = 'login' # 设置未登录用户的重定向页面
@login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id))
# 创建数据库表 (仅在第一次运行或需要时执行)
def init_db():
with app.app_context():
db.create_all()
# 如果没有管理员账户,则创建一个
if not User.query.filter_by(username='admin').first():
admin = User(username='admin', password_hash=generate_password_hash('admin123'), is_admin=True)
db.session.add(admin)
# 创建默认套餐
plan1 = Plan(name="1小时套餐", duration=3600)
plan2 = Plan(name="6小时套餐", duration=21600)
db.session.add_all([plan1, plan2])
db.session.commit()
print("数据库已初始化!默认管理员账户: admin / admin123")
# --- 路由 ---
@app.route('/')
def index():
if current_user.is_authenticated:
return redirect(url_for('user_panel'))
return render_template('index.html')
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
user = User.query.filter_by(username=username).first()
if user and check_password_hash(user.password_hash, password):
login_user(user)
return redirect(url_for('user_panel'))
flash('用户名或密码错误')
return render_template('login.html')
@app.route('/register', methods=['GET', 'POST'])
def register():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
if User.query.filter_by(username=username).first():
flash('用户名已存在')
return render_template('register.html')
new_user = User(username=username, password_hash=generate_password_hash(password))
db.session.add(new_user)
db.session.commit()
flash('注册成功,请登录!')
return redirect(url_for('login'))
return render_template('register.html')
@app.route('/logout')
@login_required
def logout():
logout_user()
return redirect(url_for('index'))
@app.route('/user_panel')
@login_required
def user_panel():
return render_template('user_panel.html', remaining_time=current_user.remaining_time)
@app.route('/redeem', methods=['GET', 'POST'])
@login_required
def redeem():
if request.method == 'POST':
card_code = request.form['card_code']
card = Card.query.filter_by(code=card_code, is_used=False).first()
if card:
# 标记卡密为已使用
card.is_used = True
card.used_by_user_id = current_user.id
card.used_at = datetime.utcnow()
# 增加用户剩余时间
current_user.remaining_time += card.plan.duration
db.session.commit()
flash(f'卡密兑换成功!已获得 {card.plan.name}。')
else:
flash('卡密无效或已被使用。')
return render_template('redeem.html')
# --- 管理员路由 ---
@app.route('/admin')
@login_required
def admin():
if not current_user.is_admin:
flash('您没有管理员权限。')
return redirect(url_for('user_panel'))
plans = Plan.query.all()
return render_template('admin.html', plans=plans)
@app.route('/admin/generate_card', methods=['POST'])
@login_required
def generate_card():
if not current_user.is_admin:
return redirect(url_for('admin'))
plan_id = request.form['plan_id']
plan = Plan.query.get(plan_id)
if not plan:
flash('无效的套餐。')
return redirect(url_for('admin'))
# 生成一个唯一的卡密
new_code = secrets.token_urlsafe(32) # 生成一个安全的随机字符串
new_card = Card(code=new_code, plan_id=plan.id)
db.session.add(new_card)
db.session.commit()
flash(f'卡密生成成功!卡密为: <strong>{new_code}</strong>')
return redirect(url_for('admin'))
if __name__ == '__main__':
init_db()
app.run(debug=True)
第三步:前端模板
templates/base.html (基础模板)
其他模板都会继承这个,包含公共的头部、导航和底部。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">{% block title %}开心DDoS卡密面板{% endblock %}</title>
<link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
</head>
<body>
<nav>
<a href="{{ url_for('index') }}">首页</a>
{% if current_user.is_authenticated %}
{% if current_user.is_admin %}
<a href="{{ url_for('admin') }}">管理后台</a>
{% endif %}
<a href="{{ url_for('user_panel') }}">用户面板</a>
<a href="{{ url_for('redeem') }}">兑换卡密</a>
<a href="{{ url_for('logout') }}">退出登录 ({{ current_user.username }})</a>
{% else %}
<a href="{{ url_for('login') }}">登录</a>
<a href="{{ url_for('register') }}">注册</a>
{% endif %}
</nav>
<div class="container">
{% with messages = get_flashed_messages() %}
{% if messages %}
{% for message in messages %}
<div class="flash">{{ message }}</div>
{% endfor %}
{% endif %}
{% endwith %}
{% block content %}{% endblock %}
</div>
</body>
</html>
templates/index.html
{% extends "base.html" %}
{% block content %}
<h1>欢迎使用开心DDoS压力测试平台</h1>
<p>本平台仅用于合法的服务器压力测试和学习目的。</p>
<p>请先<a href="{{ url_for('login') }}">登录</a>或<a href="{{ url_for('register') }}">注册</a>账户。</p>
{% endblock %}
templates/login.html 和 templates/register.html
这两个页面结构类似,这里只给出 login.html。

(图片来源网络,侵删)
{% extends "base.html" %}
{% block content %}
<h2>登录</h2>
<form method="post">
<label for="username">用户名:</label>
<input type="text" id="username" name="username" required>
<label for="password">密码:</label>
<input type="password" id="password" name="password" required>
<button type="submit">登录</button>
</form>
{% endblock %}
register.html 只需将 h2 内容改为“注册”,并添加一个确认密码字段(后端代码已处理)。
templates/user_panel.html
{% extends "base.html" %}
{% block content %}
<h2>用户面板 - {{ current_user.username }}</h2>
<p>您当前的剩余测试时长: <strong>{{ (remaining_time / 3600) | round(2) }} 小时</strong></p>
<p>请妥善保管您的账户,不要用于任何非法活动。</p>
{% endblock %}
templates/redeem.html
{% extends "base.html" %}
{% block content %}
<h2>兑换卡密</h2>
<p>请输入您获得的卡密以兑换套餐。</p>
<form method="post">
<label for="card_code">卡密:</label>
<input type="text" id="card_code" name="card_code" required>
<button type="submit">立即兑换</button>
</form>
{% endblock %}
templates/admin.html
{% extends "base.html" %}
{% block content %}
<h2>管理后台</h2>
<p>欢迎, 管理员 {{ current_user.username }}!</p>
<h3>生成新卡密</h3>
<form action="{{ url_for('generate_card') }}" method="post">
<label for="plan_id">选择套餐:</label>
<select name="plan_id" id="plan_id" required>
{% for plan in plans %}
<option value="{{ plan.id }}">{{ plan.name }} ({{ plan.duration / 3600 }}小时)</option>
{% endfor %}
</select>
<button type="submit">生成卡密</button>
</form>
{% endblock %}
第四步:前端样式 (static/style.css)
添加一些简单的CSS样式,让页面看起来更美观。
/* static/style.css */
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
background-color: #f4f4f9;
color: #333;
line-height: 1.6;
margin: 0;
padding: 0;
}
.container {
max-width: 800px;
margin: 20px auto;
padding: 20px;
background: #fff;
border-radius: 8px;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
}
nav {
background: #333;
padding: 10px 20px;
margin-bottom: 20px;
border-radius: 8px;
}
nav a {
color: #fff;
text-decoration: none;
margin-right: 15px;
font-weight: bold;
}
nav a:hover {
text-decoration: underline;
}
h1, h2, h3 {
color: #444;
}
form {
display: flex;
flex-direction: column;
gap: 10px;
}
label {
font-weight: bold;
}
input[type="text"],
input[type="password"],
select {
padding: 10px;
border: 1px solid #ddd;
border-radius: 4px;
font-size: 16px;
}
button {
padding: 10px 15px;
background-color: #007bff;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
font-size: 16px;
font-weight: bold;
}
button:hover {
background-color: #0056b3;
}
.flash {
padding: 10px;
margin-bottom: 20px;
border-radius: 4px;
background-color: #d4edda;
color: #155724;
border: 1px solid #c3e6cb;
}
第五步:如何运行
- 保存所有文件:将上述代码保存到对应路径的文件中。
- 打开终端:进入
ddos_panel文件夹。 - 运行应用:
python app.py
- 访问网站:打开浏览器,访问
http://127.0.0.1:5000。
首次运行:
- 程序会自动创建一个名为
ddos_panel.sqlite的数据库文件,并创建一个默认的管理员账户:- 用户名:
admin - 密码:
admin123
- 用户名:
- 同时会创建两个默认套餐:1小时套餐和6小时套餐。
使用流程:
- 以管理员身份登录 (
admin/admin123)。 - 进入“管理后台”,选择套餐并生成卡密。请务必复制并安全保存生成的卡密!
- 退出登录,注册一个普通用户账户。
- 用新账户登录,进入“兑换卡密”页面,粘贴刚才生成的卡密进行兑换。
- 在“用户面板”中查看剩余时长。
安全与扩展建议
- HTTPS:在生产环境中,必须使用 HTTPS 来保护用户密码和卡密在传输过程中不被窃听。
- 更强的密码哈希:
werkzeug.security默认的generate_password_hash使用的是 PBKDF2,已经足够安全。 - 输入验证:后端应该对所有用户输入进行更严格的验证和清理,防止注入攻击。
- 日志:记录关键操作,如用户登录、卡密兑换、卡密生成等,便于审计。
- 防止卡密暴力破解:可以为卡密兑换功能添加尝试次数限制或验证码。
- API接口:如果需要与DDoS服务的后端程序交互,可以设计一个RESTful API,用户面板通过API来查询或启动压力测试。
这个源码提供了一个完整、可运行的基础框架,您可以根据自己的需求进行修改和扩展,再次强调,请务必遵守法律法规,将此技术用于合法合规的用途。
