第24期 Web 安全,我们不堆术语,也不教花哨攻击。只讲一件事:怎么用最少的代码,挡住最常见的一批漏洞。安全不是上线前装个 WAF,而是每次写代码时,默认不信任任何输入。
大部分 Web 事故,绕不开这几类:
对应到 OWASP Top 10,核心就一句:别把用户输入直接当代码,也别把用户身份直接当权限。
安全 = 输入验证 + 输出编码 + 参数化查询 + 权限校验 + 安全头 + 日志监控。
少任何一项,都可能在某个角落漏水。但第一步,先把最危险的注入和 XSS 挡住。
下面这段 Python 只有十几行,却展示了两个最实用的防御动作:SQL 用参数化查询,HTML 输出做转义。
from flask import Flask, request, escape
import sqlite3
app = Flask(__name__)
@app.get("/user")
def user():
uid = request.args.get("id", "")
row = sqlite3.connect("app.db").execute(
"SELECT name FROM users WHERE id = ?", (uid,)
).fetchone()
return f"<h1>{escape(row[0])}</h1>" if row else "not found"关键点:
? 占位符让数据库区分“代码”和“数据”,防 SQL 注入;escape() 把用户内容当文本,不当作 HTML,防 XSS;innerHTML,不信任前端校验。再加两行安全头,成本极低:
@app.after_request
def secure(resp):
resp.headers["Content-Security-Policy"] = "default-src 'self'"
resp.headers["X-Content-Type-Options"] = "nosniff"
return respCSP 能限制脚本来源,nosniff 能阻止浏览器乱猜类型。它们不是万能,但能提高攻击成本。
认证:密码用 bcrypt 或 Argon2 哈希,别自己写加密。 授权:每次请求都检查“这个人能不能做这件事”,别只检查“登录了没”。 依赖:定期更新组件,锁版本,扫漏洞。 日志:记录登录、授权失败、敏感操作,但别把密码和 token 写进日志。
第一,只靠前端校验,后端完全信任请求。 第二,把用户输入拼进 SQL、命令或模板。 第三,把 token 存在 localStorage,XSS 一打就穿。 第四,忘记 CSRF 防护,状态变更接口裸奔。 第五,生产环境开 debug,报错页泄露路径和配置。 第六,依赖三年不更新,漏洞公开了还不知道。
24期 Web 安全,代码可以只有十行,但习惯要贯穿每个接口。参数化查询、输出转义、权限校验、安全头、日志监控,每一件都不难,难的是每次都做。
记住:安全不是一次上线,而是每次提交。 十行代码挡住第一道门,剩下的,靠持续审查和更新。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。