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

在 Web 安全领域,服务器是最后一道防线。无论前端如何防御、后端如何过滤,一旦 Linux 服务器本身被攻破,所有努力都将付诸东流。本文从 XSS 防御、SQL 注入防护到 Linux 服务器加固,梳理一份可落地的 Web 安全清单。

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

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

1. 反射型 XSS
恶意脚本作为请求参数发送给服务器,服务器未经处理直接“反射”回页面,常见于搜索框、错误提示页。

2. 存储型 XSS
恶意脚本被持久化存储在数据库(如评论、用户昵称),所有访问该页面的用户都会中招,危害最大。

3. DOM 型 XSS
不经过服务器,前端 JavaScript 直接从 location.hashdocument.URL 等取数据并插入 DOM,导致脚本执行。

前端防御的核心原则:永远不要信任用户输入,永远不要直接插入 HTML。

具体做法:

  • 输出编码:根据插入位置选择编码方式。HTML 内容用 HTML 实体编码,属性用引号包裹并编码,JavaScript 上下文用 \x 转义。
  • 使用安全的 API:优先使用 textContent 而非 innerHTML,使用 setAttribute 而非直接拼接字符串。
  • 启用 CSP:通过 Content-Security-Policy 头限制脚本来源,禁止 unsafe-inline,可有效缓解 XSS。
  • 输入验证:对邮箱、URL 等格式做白名单校验,但输入验证不能替代输出编码。
  • 框架自带防护:React、Vue 等默认对插值进行转义,但 dangerouslySetInnerHTMLv-html 需格外谨慎。

记住:前端防御是“减少攻击面”,真正的兜底还需要后端配合与 CSP。

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

SQL 注入的根源是“用户输入被当作 SQL 代码执行”。防止注入的关键是让数据永远只是数据

1. 预处理语句(Prepared Statements)——首选
使用参数化查询,将 SQL 模板与数据分离。以 PHP PDO 为例:

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

Java 的 PreparedStatement、Python 的 cursor.execute(sql, params) 同理。这是最有效、最推荐的方式。

2. 使用 ORM 框架
Laravel 的 Eloquent、Django ORM、Hibernate 等默认使用参数化,只要不拼接原生 SQL,基本安全。

3. 白名单校验
对于排序字段(ORDER BY)、表名等无法参数化的位置,必须用白名单映射,例如:

$allowed = ['name', 'created_at'];
$order = in_array($_GET['order'], $allowed) ? $_GET['order'] : 'id';

4. 最小权限原则
数据库账号只授予必要的 SELECT/INSERT/UPDATE/DELETE,禁用 FILEDROP 等高危权限。

5. 转义——仅作补充
mysqli_real_escape_string 等转义函数在正确使用字符集时有效,但容易遗漏,不应作为主要手段。

常见错误写法:直接拼接 "SELECT * FROM users WHERE id = " . $_GET['id'],或使用 WHERE id = '$id' 而不加引号处理。这些都应立即整改。

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

服务器加固是 Web 安全的基石。以下清单按优先级排列,建议逐项落实。

1. 账户与认证

  • 禁用 root 远程登录:PermitRootLogin no
  • 使用 SSH 密钥登录,禁用密码认证:PasswordAuthentication no
  • 修改 SSH 默认端口,减少扫描
  • 为所有服务账号设置强密码,定期轮换
  • 启用 fail2ban 自动封禁暴力破解 IP

2. 系统更新与最小化

  • 定期执行 apt update && apt upgradeyum update
  • 卸载无用软件包与服务,关闭不必要的端口
  • 使用 systemctl list-unit-files 检查自启服务,禁用不需要的

3. 防火墙与网络

  • 配置 iptablesufw,仅放行 80、443 及 SSH 端口
  • 数据库(MySQL 3306)仅监听 127.0.0.1,不对外暴露
  • 使用 netstat -tulnp 定期检查监听端口

4. 文件权限与目录

  • Web 目录权限设为 755,文件 644,禁止 777
  • 上传目录禁止执行 PHP:php_admin_flag engine off
  • 敏感文件(.envconfig.php)权限设为 600,属主为 Web 用户
  • 启用 open_basedir 限制 PHP 访问范围

5. 日志与监控

  • 开启并定期检查 /var/log/auth.log/var/log/nginx/access.log
  • 配置日志轮转,防止磁盘占满
  • 使用 auditd 监控关键文件变更
  • 部署入侵检测(如 OSSEC)或主机安全 agent

6. Web 服务加固

  • Nginx/Apache 隐藏版本号:server_tokens off
  • 禁用目录列表:autoindex off
  • 设置安全响应头:X-Frame-OptionsX-Content-Type-OptionsContent-Security-Policy
  • 限制请求体大小,防止缓冲区溢出
  • 为 HTTPS 配置强加密套件,禁用 TLS 1.0/1.1

7. 备份与恢复

  • 数据库每日自动备份,异地存储
  • 定期演练恢复流程,确保备份可用
  • 备份文件加密,权限严格控制

结语

Web 安全不是单一环节的修补,而是从前端到后端、从应用到系统的纵深防御。XSS 靠输出编码与 CSP,SQL 注入靠参数化查询,Linux 服务器靠最小权限与持续监控。三者缺一不可。建议将上述清单转化为自动化检查脚本或配置管理工具(如 Ansible),定期审计,才能真正让安全落地。

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

赞 (0) 打赏

评论 0

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

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

支付宝扫一扫打赏

微信扫一扫打赏