在 Web 安全领域,服务器是最后一道防线。无论前端如何防御、后端如何过滤,一旦 Linux 服务器本身被攻破,所有努力都将付诸东流。本文从 XSS 防御、SQL 注入防护到 Linux 服务器加固,梳理一份可落地的 Web 安全清单。
一、XSS 的常见方式与前端防御
XSS(跨站脚本攻击)的本质是攻击者将恶意脚本注入到页面中,使其在其他用户浏览器上执行。常见方式有三类:
1. 反射型 XSS
恶意脚本作为请求参数发送给服务器,服务器未经处理直接“反射”回页面,常见于搜索框、错误提示页。
2. 存储型 XSS
恶意脚本被持久化存储在数据库(如评论、用户昵称),所有访问该页面的用户都会中招,危害最大。
3. DOM 型 XSS
不经过服务器,前端 JavaScript 直接从 location.hash、document.URL 等取数据并插入 DOM,导致脚本执行。
前端防御的核心原则:永远不要信任用户输入,永远不要直接插入 HTML。
具体做法:
- 输出编码:根据插入位置选择编码方式。HTML 内容用 HTML 实体编码,属性用引号包裹并编码,JavaScript 上下文用
\x转义。 - 使用安全的 API:优先使用
textContent而非innerHTML,使用setAttribute而非直接拼接字符串。 - 启用 CSP:通过
Content-Security-Policy头限制脚本来源,禁止unsafe-inline,可有效缓解 XSS。 - 输入验证:对邮箱、URL 等格式做白名单校验,但输入验证不能替代输出编码。
- 框架自带防护:React、Vue 等默认对插值进行转义,但
dangerouslySetInnerHTML、v-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,禁用 FILE、DROP 等高危权限。
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 upgrade或yum update - 卸载无用软件包与服务,关闭不必要的端口
- 使用
systemctl list-unit-files检查自启服务,禁用不需要的
3. 防火墙与网络
- 配置
iptables或ufw,仅放行 80、443 及 SSH 端口 - 数据库(MySQL 3306)仅监听
127.0.0.1,不对外暴露 - 使用
netstat -tulnp定期检查监听端口
4. 文件权限与目录
- Web 目录权限设为
755,文件644,禁止777 - 上传目录禁止执行 PHP:
php_admin_flag engine off - 敏感文件(
.env、config.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-Options、X-Content-Type-Options、Content-Security-Policy - 限制请求体大小,防止缓冲区溢出
- 为 HTTPS 配置强加密套件,禁用 TLS 1.0/1.1
7. 备份与恢复
- 数据库每日自动备份,异地存储
- 定期演练恢复流程,确保备份可用
- 备份文件加密,权限严格控制
结语
Web 安全不是单一环节的修补,而是从前端到后端、从应用到系统的纵深防御。XSS 靠输出编码与 CSP,SQL 注入靠参数化查询,Linux 服务器靠最小权限与持续监控。三者缺一不可。建议将上述清单转化为自动化检查脚本或配置管理工具(如 Ansible),定期审计,才能真正让安全落地。
未经允许不得转载:任鹏个人博客 » Linux 服务器安全加固清单:Web 安全实战指南


朋友圈点赞图在线生成源码