后端安全防御清单:从 SQL 注入到权限控制

后端安全从来不是“加个 WAF 就完事”的简单命题。真正有效的防御,需要从代码层、数据库层、系统层到权限模型逐层设卡。本文围绕三个高频风险点——XSS、SQL 注入和服务器加固——给出一份可落地的后端安全清单。

一、XSS 的常见方式与前端防御

XSS(跨站脚本攻击)的本质是攻击者让恶意脚本在受害者浏览器中执行。后端开发者常误以为“XSS 是前端的事”,但实际上,后端输出转义、Cookie 策略和 CSP 响应头同样关键。

常见 XSS 类型

  1. 反射型 XSS:恶意脚本作为请求参数发送给服务器,服务器未经转义直接回显在响应页面中。典型场景是搜索框、错误提示页。
  2. 存储型 XSS:恶意脚本被存入数据库,所有访问该页面的用户都会中招。常见于评论、用户昵称、富文本内容。
  3. DOM 型 XSS:不经过服务器,前端 JavaScript 直接读取 location.hashinnerHTML 等危险源并写入页面。

前端防御要点

  • 输出编码:根据输出位置选择编码方式。HTML 内容用 HTML 实体编码,属性值用引号包裹并编码,JavaScript 上下文用 JSON.stringify 或专用编码。
  • 避免危险 API:优先使用 textContent 而非 innerHTML;如果必须插入 HTML,使用 DOMPurify 等成熟库进行净化。
  • CSP 内容安全策略:通过响应头 Content-Security-Policy: default-src 'self'; script-src 'self' 限制脚本来源,禁止内联脚本执行,大幅降低 XSS 危害。
  • Cookie 安全属性:设置 HttpOnly 防止脚本读取会话 Cookie,设置 SecureSameSite=Lax/Strict 减少跨站泄露。

后端需要配合的是:所有用户输入在存储前进行白名单校验,在输出时按上下文转义,并统一设置 CSP 和 Cookie 安全头。

二、MySQL 防止 SQL 注入的几种写法

SQL 注入长期位居 OWASP Top 10,根源是“把用户输入当代码执行”。以下从错误到正确,列出几种典型写法。

错误写法:字符串拼接

# 危险!用户输入直接拼入 SQL
query = "SELECT * FROM users WHERE username = '" + username + "'"
cursor.execute(query)

攻击者输入 ' OR '1'='1 即可绕过认证。

正确写法一:参数化查询(预编译)

# 安全:使用占位符,数据库区分代码与数据
cursor.execute("SELECT * FROM users WHERE username = %s", (username,))

这是最推荐的方式。无论输入内容如何,数据库都将其视为数据而非 SQL 代码。

正确写法二:ORM 框架

# Django ORM 自动参数化
User.objects.filter(username=username)

ORM 底层通常使用参数化查询,但要注意避免 .raw().extra() 中拼接字符串。

正确写法三:存储过程(需正确使用)

CREATE PROCEDURE GetUser(IN uname VARCHAR(50))
BEGIN
  SELECT * FROM users WHERE username = uname;
END

存储过程本身不防注入,只有内部使用参数而非动态拼接时才安全。

额外加固措施

  • 最小权限原则:Web 应用连接数据库的账号只授予必要表的 SELECT/INSERT/UPDATE 权限,禁用 DROP、FILE 等。
  • 输入校验:对类型、长度、格式做白名单校验,例如 ID 必须是整数。
  • 错误信息脱敏:生产环境不返回数据库错误详情,避免泄露表结构。

三、Linux 服务器安全加固清单

后端服务最终运行在 Linux 服务器上,系统层加固是最后一道防线。

1. 账户与认证

  • 禁用 root 远程 SSH 登录:PermitRootLogin no
  • 使用密钥认证,关闭密码登录:PasswordAuthentication no
  • 为每个服务创建独立系统用户,禁止 shell 登录:/sbin/nologin
  • 配置 sudo 细粒度权限,避免直接使用 root。

2. 网络与防火墙

  • 仅开放必要端口(如 80、443、SSH 自定义端口)
  • 使用 ufwfirewalld 设置默认拒绝策略
  • 数据库(3306)、Redis(6379)等只监听内网或 127.0.0.1
  • 部署 Fail2ban 自动封禁暴力破解 IP。

3. 系统更新与补丁

  • 启用自动安全更新:unattended-upgrades(Debian/Ubuntu)或 dnf-automatic(RHEL 系)
  • 定期检查内核和关键库漏洞,及时重启生效。

4. 日志与监控

  • 开启 auditd 记录关键系统调用
  • 集中收集 /var/log/auth.log、Nginx 访问日志
  • 设置告警:异常登录、CPU 突增、大量 4xx/5xx 请求。

5. 服务与文件权限

  • 关闭不必要的服务:systemctl disable telnet.socket
  • Web 目录权限:文件 644,目录 755,属主为专用用户
  • 敏感配置文件(如 .env)权限设为 600
  • 使用 chattr +i 保护关键文件(如 /etc/passwd 需谨慎)。

6. 备份与恢复

  • 定期备份数据库和代码,备份文件加密并异地存储
  • 每季度做一次恢复演练,确保备份可用。

四、权限控制:贯穿始终的主线

无论是 XSS、SQL 注入还是服务器加固,底层逻辑都是权限控制。

  • 数据层:数据库账号最小权限,行级/列级访问控制。
  • 应用层:每个 API 都要校验当前用户是否有权操作目标资源,避免水平越权(改 ID 访问他人数据)和垂直越权(普通用户调用管理员接口)。
  • 系统层:服务进程以非 root 运行,容器内使用非 root 用户,Kubernetes 配置 securityContext

建议在代码评审清单中加入一条:“这个接口的权限校验写在哪里?如果用户篡改 ID 会怎样?”

安全不是一次性的任务,而是持续的过程。从输入验证到输出编码,从参数化查询到最小权限,从 SSH 加固到权限模型设计,每一层都做好自己的事,攻击者就难以找到突破口。

未经允许不得转载:任鹏个人博客 » 后端安全防御清单:从 SQL 注入到权限控制

赞 (0) 打赏

评论 0

取消
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏