为什么要学 Web 安全
作为开发者,理解常见攻击手段是写出安全代码的前提。本篇带你认识三种最高频的 Web 漏洞,并给出可落地的防护建议。
本文仅用于学习与安全防御研究,请在自有或授权的环境中实践,切勿对未授权目标进行任何测试。
SQL 注入:别把用户输入当 SQL
原理:当后端把用户输入直接拼进 SQL 语句,输入就可能变成”可执行的代码”。例如:
// 危险写法:直接拼接
$sql = "SELECT * FROM users WHERE name = '" . $_GET['name'] . "'";
如果用户输入 x' OR '1'='1,拼出的 SQL 会返回所有用户,甚至被用来拖库。
防护(根本解法):使用参数化查询(预编译),让 SQL 结构与数据分离:
$stmt = $pdo->prepare("SELECT * FROM users WHERE name = ?");
$stmt->execute([$_GET['name']]);
再辅以输入校验、最小权限数据库账号、关闭错误回显,就能把风险降到最低。
XSS:别把用户输入当 HTML/JS
原理:当页面把用户输入原样输出到 HTML,恶意脚本就可能被执行,偷走 cookie、篡改页面。例如搜索框把关键词回显:
<h1>搜索:<?php echo $_GET['q']; ?></h1>
输入 <script>alert(1)</script> 就会被浏览器执行。
防护:根据输出位置做正确的编码/转义:
- 进 HTML 正文 → HTML 实体编码;
- 进属性 → 加引号并编码;
- 进 JS → JS 编码;
- 给 cookie 加
HttpOnly,让 JS 读不到会话; - 用 CSP 限制脚本来源。
现代模板引擎默认会对插值转义,别滥用”不转义”的 API(如 v-html、dangerouslySetInnerHTML)处理用户数据。
CSRF:别让浏览器替你发请求
原理:浏览器访问某站点时会自动带上该站 cookie。如果你已登录网银,又打开恶意页面,它悄悄用你的身份发一个转账请求,银行看到合法 cookie 就照办了——攻击者根本不需要你的密码。
防护:核心是”证明这是你本人的意愿”:
- CSRF Token:每个表单带服务器生成的随机一次性令牌,跨站页面读不到它;
- SameSite Cookie:设为
Lax或Strict,跨站请求不带 cookie; - 敏感操作二次验证:转账、改密码要求再输密码或验证码。
给开发者的安全编码清单
- 所有外部输入都不可信:URL 参数、表单、Cookie、Header、文件上传,一律校验;
- 查询用参数化,绝不拼接 SQL;
- 输出按上下文转义,防 XSS;
- 改状态的操作加 CSRF 防护(Token / SameSite / 二次验证);
- 密码用强哈希(bcrypt / Argon2),别明文、别 MD5;
- 最小权限:应用账号、数据库账号、服务器账号都只给必要权限;
- 关掉错误回显与目录浏览,生产环境不泄露路径和版本;
- 依赖库及时更新,关注 CVE;
- 上传文件白名单 + 存不可执行目录(最好上云存储);
- 全站 HTTPS + HSTS,敏感 cookie 加
Secure。
安全是”左移”的事
最好的安全,是在写代码时就把洞堵上,而不是上线后被打穿再补。把上面这些习惯变成肌肉记忆,你就已经挡住了绝大多数常见攻击。
更多实战案例:一个登录框能牵出多少漏洞
别小看网页上最常见的登录框,顺着它可以串起整门 Web 安全。先看传输:密码是不是明文 HTTP 发出去(抓包一看便知),有没有走 HTTPS。再看认证:用户名是否存在会不在错误提示里暴露(存在/不存在两种提示=可枚举账号);密码错误次数不限=可暴破;有没有验证码或锁定。再看会话:登录后 cookie 有没有 HttpOnly、Secure、SameSite;退出后旧 session 是否还有效(会话不失效)。再看授权:登录后把请求里的用户标识改成别人的,能不能看别人数据(越权)。再看注入:账号密码框有没有 SQL 注入。一个登录框,几乎覆盖了 Web 安全的大半主题,所以它是入门最好的练习场。
更多实战案例:从发现到利用的思维链
安全测试不是”拿工具扫一下”,而是一串有逻辑的问题:这个功能把什么数据发到哪?服务器信不信客户端?哪些值本该服务端算却让前端传?哪些操作没校验权限?数据流里有没有把用户输入当代码执行(注入)、当文件读(包含)、当地址访问(SSRF)、当 HTML 渲染(XSS)?顺着”输入—处理—输出—信任边界”去想,漏洞自然浮现。新手常犯的错是盯着工具报告,却不去理解”为什么这里会出事”。
更多实战案例:防守方怎么想
理解攻击才能更好防守。核心思路是减少信任、明确边界、纵深防御:不信任任何客户端输入(服务端校验一切)、最小权限(账号只给必要权限)、默认拒绝(没明确允许的都拒绝)、失败安全(出错时回到安全状态而非放行)、可审计(关键操作留痕)。把常见漏洞的修复当成”标准动作”:参数化查询防注入、输出编码防 XSS、白名单防包含、加密与签名防篡改。安全是流程,不是一次性补丁。
常见坑(学习者易踩)
- 只在自己浏览器点一点:不抓包、不看请求,永远发现不了越权与信息泄露。
- 把”能跑通功能”当”安全”:功能正常不代表没漏洞,攻击走的是非常规路径。
- 学攻击不学防守:只懂怎么打不懂怎么修,价值减半。
- 忽视法律边界:在未授权系统上”练手”是违法的,务必在授权靶场或自己搭建的环境练习。
重要声明
本系列所有内容仅用于合法授权的安全测试学习、自查与防御研究。请在你拥有或已获书面授权的环境(如靶场 DVWA、sqli-labs、自己搭建的虚拟机)中练习;严禁对任何未经授权的系统、网站、设备进行扫描、攻击或破坏,违者可能触犯《网络安全法》等相关法律法规,后果自负。技术无善恶,用法见人心。
小测验
- 问题1:登录框能练到哪些安全知识?答案:传输、认证、会话、授权、注入,几乎覆盖大半 Web 安全。
- 问题2:防守核心思路?答案:减少信任、明确边界、纵深防御、默认拒绝、可审计。
- 问题3:练习必须在什么环境?答案:授权靶场或自搭环境,严禁未授权测试。
更多实战案例:把安全知识串成学习路线
入门 Web 安全建议路线:先打牢 Web 基础(HTTP、HTML、JS、前后端怎么交互),再学 OWASP Top 10 逐个理解(注入、XSS、越权、配置错误等),然后搭靶场(DVWA、sqli-labs、upload-labs、SQLi-Labs、Pikachu)动手复现每个漏洞,再学工具(Burp、sqlmap、nmap)提升效率,最后学代码审计与防御。边学边记”攻击手法—危害—修复”三位一体,知识才扎实。安全是攻防双修,只攻不防走不远。
常见坑(终补)
- 只在自己浏览器点一点:不抓包、不看请求,发现不了越权与泄露。
- 把能跑通功能当安全:攻击走非常规路径,功能正常不代表没漏洞。
- 学攻击不学防守:只懂打不懂修,价值减半。
- 忽视法律边界:未授权系统上练手是违法,务必在授权靶场练习。
进阶(终补):防守思维与职业
理解攻击才能更好防守。核心:减少信任、明确边界、纵深防御。安全是流程不是一次性补丁。职业上,渗透测试、安全研发、蓝队防守、安全合规都是方向;无论哪条路,合法合规、守住底线是前提。技术无善恶,用法见人心,把能力用在保护上才有价值。
小测验(终补)
- 问题1:登录框能练到哪些安全知识?答案:传输、认证、会话、授权、注入,覆盖大半 Web 安全。
- 问题2:防守核心思路?答案:减少信任、明确边界、纵深防御、默认拒绝、可审计。
- 问题3:练习必须在什么环境?答案:授权靶场或自搭环境,严禁未授权测试。
这一篇你该记住的
开发者学安全是为了”写不出洞”。三大高频漏洞:SQL 注入(拼接用户输入进 SQL,根治=参数化查询)、XSS(用户输入原样进 HTML,防护=按上下文转义+HttpOnly+CSP)、CSRF(借浏览器自动带 cookie,防护=Token+SameSite+二次验证)。日常用”安全编码清单”十条原则把风险左移——在写代码时就堵洞,胜过上线后被打穿再补。
至此,Web 安全从基础认知到渗透全链路都讲完了。如果你是开发者,把安全编码清单贴在工位上;如果你走安全方向,前面的渗透 19 篇已经给你铺好了从协议到报告的完整路径。