在 Web 安全领域,服务器是承载业务的核心载体,一旦被攻破,数据泄露、服务瘫痪、甚至成为攻击跳板都将接踵而至。很多运维和开发人员把注意力集中在代码层面,却忽略了服务器本身的加固。本文从 Web 安全视角出发,围绕 XSS 防御、SQL 注入防护以及 Linux 服务器安全加固三个维度,给出一份可落地的实战清单。
一、XSS 的常见方式与前端防御
XSS(跨站脚本攻击)的本质是攻击者将恶意脚本注入到页面中,当其他用户访问时脚本在其浏览器中执行。常见方式主要有三类:
1. 反射型 XSS
恶意脚本作为请求参数发送给服务器,服务器未经处理直接“反射”回页面。例如搜索功能中,搜索关键词被原样输出到 HTML 中,攻击者构造链接诱导用户点击即可触发。
2. 存储型 XSS
恶意脚本被持久化存储在服务器(如评论、昵称、文章内容),所有访问该页面的用户都会中招。这类 XSS 危害最大,常见于论坛、社交平台。
3. DOM 型 XSS
不经过服务器,前端 JavaScript 直接从 URL、location.hash、document.referrer 等来源取数据并插入 DOM,例如 innerHTML、document.write 等危险操作。
前端防御要点:
- 输出编码:根据输出位置选择编码方式。HTML 内容用 HTML 实体编码,属性用属性编码,URL 用 URL 编码,JavaScript 上下文用 JS 编码。不要试图用一套编码应对所有场景。
- 避免危险 API:优先使用
textContent而非innerHTML;必须插入 HTML 时,使用 DOMPurify 等成熟库进行净化。 - CSP 内容安全策略:通过
Content-Security-Policy响应头限制脚本来源,禁止内联脚本和eval,即使注入成功也难以执行。 - 输入校验与白名单:对用户输入做格式校验,例如邮箱、手机号、URL 等,尽量采用白名单而非黑名单。
- HttpOnly Cookie:为敏感 Cookie 设置
HttpOnly和Secure属性,降低 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 方法,如 whereRaw、DB::raw,如果拼接了用户输入,同样存在注入风险。
4. 存储过程
使用存储过程并配合参数传递,也能有效防止注入,但需注意存储过程内部不要动态拼接 SQL。
5. 最小权限原则
为 Web 应用分配独立的数据库账号,只授予必要的库表权限,禁止 DROP、FILE、GRANT 等高危权限。即使注入成功,也能将损失降到最低。
常见错误写法:
// 危险:直接拼接
$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-Options、X-Frame-Options、Strict-Transport-Security、Content-Security-Policy。 - 限制请求体大小、请求频率,防止 CC 攻击。
- 上传目录禁止执行脚本,避免 WebShell 落地。
4. 数据库与文件
- MySQL 仅监听内网地址,禁止公网访问。
- 数据库账号最小权限,定期审计慢查询与异常连接。
- 敏感文件权限设为 600,Web 目录属主与运行用户分离。
- 定期备份,并验证备份可恢复。
5. 日志与监控
- 开启系统日志、Web 访问日志、数据库日志,集中收集。
- 配置日志轮转,防止磁盘占满。
- 部署监控告警,关注异常登录、CPU 突增、外联请求等指标。
6. 应急响应
- 制定安全事件响应流程,保留取证数据。
- 定期进行漏洞扫描与渗透测试。
- 关键配置纳入版本管理,便于快速恢复。
结语
Web 安全不是单一环节的工作,而是从前端输出编码、后端参数化查询到服务器系统加固的纵深防御体系。XSS 防御的核心在输出,SQL 注入防御的核心在参数化,服务器加固的核心在最小权限与持续更新。把这份清单落到日常运维与开发规范中,才能真正降低被攻击的风险。安全没有终点,只有持续迭代。
未经允许不得转载:任鹏个人博客 » Linux 服务器安全加固清单:Web 安全实战指南


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