2026/9/2 7:07:39

【八个月网安课程】第三周·周四:数据流转全链路——前端→HTTP请求→后端处理→数据库存储→响应返回

【八个月网安课程】第三周·周四:数据流转全链路——前端→HTTP请求→后端处理→数据库存储→响应返回 以下是第三周周四学习内容的详细展开聚焦 Web 应用完整数据流转链路。今天你要亲手搭建一个简易登录处理脚本用浏览器和抓包工具观察从输入框到服务器响应全过程并画出数据流向图。这是理解 SQL 注入、XSS、逻辑漏洞的绝对前提。第三周·周四数据流转全链路——前端→HTTP请求→后端处理→数据库存储→响应返回 今日学习目标达成效果能在不参考资料的情况下画出一次登录请求的完整数据流向图包含浏览器表单 → HTTP 请求 → Web 服务器 → 后端脚本 → 数据库查询 → 响应返回能正确说出各环节的职责、数据格式及潜在安全风险如明文传输、注入点、错误信息泄露能独立搭建一个包含前端表单、后端接收PHP 或 Python、数据库查询的简易登录模拟环境能**使用浏览器开发者工具Network 面板**找到登录请求查看请求方法、载荷Payload和响应状态能从安全角度指出每个环节可能出现的漏洞类型注入、敏感信息泄露、逻辑绕过等为后续漏洞学习建立全景视图。 一、一次登录请求的完整旅程假设你正在访问一个网站在登录页面输入账号admin、密码pass123点击“登录”按钮。下面是数据依次经过的环节浏览器 (前端)用户在input中填入数据点击提交按钮或按回车。浏览器根据form的action和method构建 HTTP 请求。若methodPOST数据被编码放入请求体若GET则拼接在 URL 后面。安全点此时数据仍为明文除非页面已 HTTPS且完全受用户控制任何前端验证都只是“温馨提示”。HTTP 请求报文浏览器构造类似以下的请求报文并发送到服务器POST /login.php HTTP/1.1 Host: www.example.com Content-Type: application/x-www-form-urlencoded Content-Length: 29 usernameadminpasswordpass123安全点缺乏 HTTPS 时中间人可直接嗅探密码即使使用 POST密码在 HTTP 下仍为明文。Web 服务器如 Apache/Nginx收到请求后根据 URL 路径将请求分发给对应的后端处理程序如 PHP 解释器、Python WSGI 应用。服务器可能在此进行基础过滤URL 长度、请求方法限制等但不做业务逻辑校验。后端脚本应用逻辑层后端代码PHP、Python、Java 等获取参数$_POST[username]、$_POST[password]。执行业务逻辑如检查用户名是否存在、密码是否正确、账号是否锁定等。关键安全动作必须对输入进行过滤/转义、使用参数化查询、验证密码哈希。示例 PHP 代码片段$user$_POST[username];$pass$_POST[password];// 危险写法直接拼接 SQL导致注入$sqlSELECT * FROM users WHERE username$user AND password$pass;// 安全写法使用预处理语句$stmt$pdo-prepare(SELECT * FROM users WHERE username?);$stmt-execute([$user]);安全点此处是 SQL 注入、命令注入、业务逻辑漏洞的核心发源地。数据库系统如 MySQL接收 SQL 查询在表里查找匹配的记录。将结果集返回给后端脚本成功找到用户 → 登录有效未找到 → 返回错误。安全点若使用 root 账户且无权限隔离一次注入可泄露全库。响应返回后端根据业务结果生成 HTTP 响应成功可能返回HTTP/1.1 302 Found重定向到用户主页并设置会话 Cookie。失败返回200 OK并显示错误信息“用户名或密码错误”。响应报文包含状态码、头部Set-Cookie、HTML 内容。安全点错误信息过于详细可能被用于枚举用户名如区分“用户不存在”与“密码错误”Cookie 属性缺失无 HttpOnly/Secure则易被窃取。全链路总结前端只是数据的起点真正的安全防线必须在服务器端每一层都布防。✍️ 二、动手实践搭建简易登录模拟环境为了让你亲眼看到数据流转我们搭建一个最小化的环境HTML 表单 Python 后端 SQLite 数据库无需复杂安装。你也可以使用 PHP MySQL但 Python 更易快速实验。实验准备确认系统已安装 Python3无需额外安装数据库SQLite 内置在 Python 中。步骤 1创建目录和前端页面mkdir~/login_labcd~/login_lab创建index.html前端表单!DOCTYPEhtmlhtmllangzh-CNheadmetacharsetUTF-8title登录实验/title/headbodyh1用户登录/h1formaction/loginmethodpostlabel用户名inputtypetextnameusername/labelbrlabel密码inputtypepasswordnamepassword/labelbrinputtypesubmitvalue登录/form/body/html步骤 2创建后端脚本Python 简易 HTTP 服务器处理登录我们不使用框架直接写一个可处理 POST 的脚本server.pyimporthttp.serverimportsqlite3importurllib.parseimportos# 初始化数据库创建一个 users 表并插入测试账号definit_db():connsqlite3.connect(users.db)cconn.cursor()c.execute(CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, username TEXT, password TEXT))c.execute(INSERT OR IGNORE INTO users (id, username, password) VALUES (1, admin, pass123))conn.commit()conn.close()init_db()classLoginHandler(http.server.BaseHTTPRequestHandler):defdo_GET(self):ifself.path/orself.path/index.html:try:withopen(index.html,rb)asf:contentf.read()self.send_response(200)self.send_header(Content-type,text/html; charsetutf-8)self.end_headers()self.wfile.write(content)except:self.send_error(404)else:self.send_error(404)defdo_POST(self):ifself.path/login:# 获取请求体长度content_lengthint(self.headers[Content-Length])post_dataself.rfile.read(content_length).decode(utf-8)# 解析表单数据paramsurllib.parse.parse_qs(post_data)usernameparams.get(username,[])[0]passwordparams.get(password,[])[0]# 查询数据库此处为了简单使用拼接实际应用需参数化connsqlite3.connect(users.db)cconn.cursor()# ⚠️ 注意此处仅为演示后面安全课程会用参数化替代queryfSELECT * FROM users WHERE username{username} AND password{password}c.execute(query)resultc.fetchone()conn.close()ifresult:self.send_response(200)self.send_header(Content-type,text/html; charsetutf-8)self.end_headers()self.wfile.write(bh1Login Success! Welcome result[1].encode()b/h1)else:self.send_response(200)self.send_header(Content-type,text/html; charsetutf-8)self.end_headers()self.wfile.write(bh1Login Failed! Invalid credentials./h1)else:self.send_error(404)if__name____main__:server_address(,8080)httpdhttp.server.HTTPServer(server_address,LoginHandler)print(Server running on http://127.0.0.1:8080)httpd.serve_forever()步骤 3启动服务并测试python3 server.py在浏览器访问http://127.0.0.1:8080会看到登录表单。输入admin/pass123点击登录应显示 “Login Success! Welcome admin”。输入错误密码则显示失败信息。步骤 4使用开发者工具观察完整数据流按 F12 → Network 面板勾选 “Preserve log”。点击登录后找到名为login的请求Headers→ Request Method: POSTRequest Headers查看Content-TypePayload或 Request Payload看到usernameadminpasswordpass123Response查看返回的 HTML 内容及状态码。安全观察即使使用 POST密码在载荷中仍然是明文passwordpass123如果不使用 HTTPS传输过程可被嗅探。后端代码中我们使用了拼接 SQLfSELECT * FROM users WHERE username{username} AND password{password}这是典型的 SQL 注入风险。尝试在用户名框输入admin--单引号注释符密码随便填观察是否会绕过登录此环境会因为注释掉了密码检查思考今天的环境是故意不安全的正是为了直观展示注入点。后续学习 SQL 注入时你会明白原理并深入利用。 三、画出你的数据流向图今日必做作业请在一张纸上或电子笔记中画出从输入账号到登录成功全过程的流向图标注每个环节的安全点。参考结构如下[浏览器表单] → [HTTP POST 明文载荷] → [Nginx/Apache 接收] → [PHP/Python 脚本] ↑ ↓ [用户输入] [数据库查询 (可能注入)] ↑ ↓ [显示结果] ← [HTTP 响应 Set-Cookie] ← [返回结果给服务器] ← [数据库返回数据]必须标注出明文传输风险、SQL 注入点、错误信息泄露风险、Cookie 属性设置。 四、课后测试题与解析测试题 1用户输入账号密码点击登录后数据依次经过哪些环节请用文字或图描述。参考答案用户在浏览器表单输入用户名和密码点击提交。浏览器构建 HTTP POST 请求将用户名和密码编码到请求体中如usernameadminpasswordpass123。请求通过网络发送到 Web 服务器可能经过代理、防火墙。Web 服务器根据 URI 将请求转发给后端处理程序如 PHP 或 Python 脚本。后端脚本获取用户名和密码参数可能经过过滤或直接用于构造 SQL 查询。后端连接数据库发送查询语句如SELECT * FROM users WHERE ...。数据库返回查询结果给后端。后端根据结果决定登录成功或失败并生成 HTTP 响应可能包含 Set-Cookie 创建会话。浏览器接收响应根据状态码和内容展示对应页面成功跳转或显示错误信息。测试题 2在 F12 网络面板中找到登录请求的载荷。请写出操作步骤。参考答案打开浏览器按 F12 进入开发者工具切换到Network网络面板。确保 “Preserve log” 复选框被选中避免页面刷新后记录丢失。在登录页面输入用户名和密码点击登录。在 Network 面板的名称列表中找到登录请求通常路径为/login或类似点击它。在详情区域中切换到Payload标签页部分浏览器称为 “Request Payload” 或 “Form Data”。可看到以键值对形式呈现的表单数据如username: admin、password: pass123。如果没看到 Payload 标签可以查看Headers标签底部的 “Form Data” 区域或直接看 “Request Body”。安全延伸在真实渗透测试中你还会使用 BurpSuite 或 Wireshark 抓取同样信息并在不依赖浏览器的情况下篡改这些载荷。✅ 今日学习效果自检清单我能闭眼画出登录请求的完整数据流向图前端→网络→后端→数据库→返回我搭建了 Python 登录模拟环境并成功登录和失败我在 Network 面板中找到了 POST 请求并查看了载荷用户名和密码我意识到了明文传输、SQL 拼接的风险并尝试了admin--绕过可在测试题环境尝试我理解了每个环节都可能存在安全漏洞这为后续专项漏洞学习提供了“地图”⚠️ 阶段避坑重点不要在自己的模拟环境中使用真实密码我们使用简单密码和测试数据库仅用于学习。不要对外暴露实验服务默认监听在127.0.0.1如果改成0.0.0.0且没有防火墙可能被外部访问。不要将今天的有意漏洞代码用于生产SQL 拼接是典型的错误示范下周我们学习 SQL 注入后会教参数化查询的正确写法。不要只背流程而不动手画图画图能固化逻辑画错立刻知道哪里理解有偏差。强烈建议用笔在纸上画一遍。明天周五我们将学习开发工具 Network 面板实战继续深化对 HTTP 请求响应的分析能力为接下来的 SQL 注入、XSS 等漏洞学习培养精准的观察力。请保留今天的实验环境明天会直接用它来练习分析 Headers 和 Response。