首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >24期 Web 安全:十行代码,守住第一道门

24期 Web 安全:十行代码,守住第一道门

原创
作者头像
搜weiranit.fun
发布于 2026-09-12 17:10:05
发布于 2026-09-12 17:10:05
1120
举报

第24期 Web 安全,我们不堆术语,也不教花哨攻击。只讲一件事:怎么用最少的代码,挡住最常见的一批漏洞。安全不是上线前装个 WAF,而是每次写代码时,默认不信任任何输入。

一、Web 安全到底防什么

大部分 Web 事故,绕不开这几类:

  • 注入:SQL、命令、模板注入;
  • 跨站脚本:XSS;
  • 跨站请求伪造:CSRF;
  • 失效的认证与授权;
  • 敏感数据泄露;
  • 安全配置错误;
  • 依赖组件漏洞;
  • 日志与监控不足。

对应到 OWASP Top 10,核心就一句:别把用户输入直接当代码,也别把用户身份直接当权限。

二、最小防御公式

安全 = 输入验证 + 输出编码 + 参数化查询 + 权限校验 + 安全头 + 日志监控。

少任何一项,都可能在某个角落漏水。但第一步,先把最危险的注入和 XSS 挡住。

三、少量代码:参数化 + 转义

下面这段 Python 只有十几行,却展示了两个最实用的防御动作:SQL 用参数化查询,HTML 输出做转义。

代码语言:javascript
复制
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,不信任前端校验。

再加两行安全头,成本极低:

代码语言:javascript
复制
@app.after_request
def secure(resp):
    resp.headers["Content-Security-Policy"] = "default-src 'self'"
    resp.headers["X-Content-Type-Options"] = "nosniff"
    return resp

CSP 能限制脚本来源,nosniff 能阻止浏览器乱猜类型。它们不是万能,但能提高攻击成本。

四、比代码更重要的四件事

认证:密码用 bcrypt 或 Argon2 哈希,别自己写加密。 授权:每次请求都检查“这个人能不能做这件事”,别只检查“登录了没”。 依赖:定期更新组件,锁版本,扫漏洞。 日志:记录登录、授权失败、敏感操作,但别把密码和 token 写进日志。

五、24期常见坑

第一,只靠前端校验,后端完全信任请求。 第二,把用户输入拼进 SQL、命令或模板。 第三,把 token 存在 localStorage,XSS 一打就穿。 第四,忘记 CSRF 防护,状态变更接口裸奔。 第五,生产环境开 debug,报错页泄露路径和配置。 第六,依赖三年不更新,漏洞公开了还不知道。

六、结语

24期 Web 安全,代码可以只有十行,但习惯要贯穿每个接口。参数化查询、输出转义、权限校验、安全头、日志监控,每一件都不难,难的是每次都做。

记住:安全不是一次上线,而是每次提交。 十行代码挡住第一道门,剩下的,靠持续审查和更新。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 一、Web 安全到底防什么
  • 二、最小防御公式
  • 三、少量代码:参数化 + 转义
  • 四、比代码更重要的四件事
  • 五、24期常见坑
  • 六、结语
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档