Linux 服务器安全加固清单:Web 安全实战指南

在 Web 安全领域,服务器是承载业务的核心载体,一旦被攻破,数据泄露、服务瘫痪、甚至成为攻击跳板都将接踵而至。很多运维和开发人员把注意力集中在代码层面,却忽略了服务器本身的加固。本文从 Web 安全视角出发,围绕 XSS 防御、SQL 注入防护以及 Linux 服务器安全加固三个维度,给出一份可落地的实战清单。

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

XSS(跨站脚本攻击)的本质是攻击者将恶意脚本注入到页面中,当其他用户访问时脚本在其浏览器中执行。常见方式主要有三类:

1. 反射型 XSS

恶意脚本作为请求参数发送给服务器,服务器未经处理直接“反射”回页面。例如搜索功能中,搜索关键词被原样输出到 HTML 中,攻击者构造链接诱导用户点击即可触发。

2. 存储型 XSS

恶意脚本被持久化存储在服务器(如评论、昵称、文章内容),所有访问该页面的用户都会中招。这类 XSS 危害最大,常见于论坛、社交平台。

3. DOM 型 XSS

不经过服务器,前端 JavaScript 直接从 URL、location.hashdocument.referrer 等来源取数据并插入 DOM,例如 innerHTMLdocument.write 等危险操作。

前端防御要点:

  • 输出编码:根据输出位置选择编码方式。HTML 内容用 HTML 实体编码,属性用属性编码,URL 用 URL 编码,JavaScript 上下文用 JS 编码。不要试图用一套编码应对所有场景。
  • 避免危险 API:优先使用 textContent 而非 innerHTML;必须插入 HTML 时,使用 DOMPurify 等成熟库进行净化。
  • CSP 内容安全策略:通过 Content-Security-Policy 响应头限制脚本来源,禁止内联脚本和 eval,即使注入成功也难以执行。
  • 输入校验与白名单:对用户输入做格式校验,例如邮箱、手机号、URL 等,尽量采用白名单而非黑名单。
  • HttpOnly Cookie:为敏感 Cookie 设置 HttpOnlySecure 属性,降低 XSS 窃取会话的风险。

需要强调的是,XSS 的根本防御在输出环节,前端校验只能提升体验,不能替代服务端的输出编码。

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

SQL 注入的根源是用户输入被拼接进 SQL 语句并当作代码执行。以下是几种正确的防御写法,按推荐程度排序。

1. 预处理语句(Prepared Statement)——首选

预处理语句将 SQL 结构与数据分离,参数值永远不会被解析为 SQL 语法。

$stmt = $pdo->prepare('SELECT * FROM users WHERE email = ? AND status = ?');
$stmt->execute([$email, $status]);

Java 中对应 PreparedStatement,Python 中对应 cursor.execute(sql, params)。这是最可靠的方式。

2. 参数化查询与命名占位符

$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email');
$stmt->execute([':email' => $email]);

命名占位符可读性更好,本质与位置占位符一致。

3. ORM 框架的安全用法

使用 Laravel Eloquent、Hibernate、SQLAlchemy 等 ORM 时,尽量使用其查询构造器:

User::where('email', $email)->first();

但要警惕 ORM 中的原生 SQL 方法,如 whereRawDB::raw,如果拼接了用户输入,同样存在注入风险。

4. 存储过程

使用存储过程并配合参数传递,也能有效防止注入,但需注意存储过程内部不要动态拼接 SQL。

5. 最小权限原则

为 Web 应用分配独立的数据库账号,只授予必要的库表权限,禁止 DROPFILEGRANT 等高危权限。即使注入成功,也能将损失降到最低。

常见错误写法:

// 危险:直接拼接
$sql = "SELECT * FROM users WHERE email = '$email'";

此外,转义函数(如 mysqli_real_escape_string)只能作为辅助手段,不能替代预处理语句。

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

服务器是 Web 应用的最后一道防线。以下清单按类别整理,建议逐项核对。

1. 账号与认证

  • 禁用 root 远程登录,修改 SSH 端口,使用密钥认证代替密码。
  • 创建普通用户并通过 sudo 提权,遵循最小权限原则。
  • 定期清理无用账号,锁定长期不登录的账户。
  • 配置 fail2ban 防止 SSH 暴力破解。

2. 系统与内核

  • 及时更新系统补丁,开启自动安全更新。
  • 关闭不必要的服务与端口,使用 ss -tulnp 审查监听端口。
  • 配置防火墙(iptables、firewalld 或 ufw),仅放行必要端口。
  • 启用 SELinux 或 AppArmor,限制服务越权访问。

3. Web 服务加固

  • Nginx/Apache 以低权限用户运行,禁止目录浏览。
  • 隐藏版本号,关闭 server_tokens
  • 配置安全响应头:X-Content-Type-OptionsX-Frame-OptionsStrict-Transport-SecurityContent-Security-Policy
  • 限制请求体大小、请求频率,防止 CC 攻击。
  • 上传目录禁止执行脚本,避免 WebShell 落地。

4. 数据库与文件

  • MySQL 仅监听内网地址,禁止公网访问。
  • 数据库账号最小权限,定期审计慢查询与异常连接。
  • 敏感文件权限设为 600,Web 目录属主与运行用户分离。
  • 定期备份,并验证备份可恢复。

5. 日志与监控

  • 开启系统日志、Web 访问日志、数据库日志,集中收集。
  • 配置日志轮转,防止磁盘占满。
  • 部署监控告警,关注异常登录、CPU 突增、外联请求等指标。

6. 应急响应

  • 制定安全事件响应流程,保留取证数据。
  • 定期进行漏洞扫描与渗透测试。
  • 关键配置纳入版本管理,便于快速恢复。

结语

Web 安全不是单一环节的工作,而是从前端输出编码、后端参数化查询到服务器系统加固的纵深防御体系。XSS 防御的核心在输出,SQL 注入防御的核心在参数化,服务器加固的核心在最小权限与持续更新。把这份清单落到日常运维与开发规范中,才能真正降低被攻击的风险。安全没有终点,只有持续迭代。

未经允许不得转载:任鹏个人博客 » Linux 服务器安全加固清单:Web 安全实战指南

赞 (0) 打赏

评论 0

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

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

支付宝扫一扫打赏

微信扫一扫打赏