Nginx防范XSS和点击劫持最直接手段是在server块中配置带always参数的安全响应头:CSP禁用unsafe-inline/eval、X-Frame-Options设SAMEORIGIN或DENY、X-Content-Type-Options设nosniff、X-XSS-Protection仅作辅助启用mode=block。

在 Nginx 的 server 块中配置安全响应头,是防范 XSS 和点击劫持最直接、成本最低的手段。它不依赖后端代码改动,但必须正确设置参数(尤其是 always),否则错误页会漏防。
添加关键安全响应头(带 always 参数)
所有安全头都应加 always,确保 404、500 等非 200 响应也生效,避免防护断层:
-
Content-Security-Policy(CSP):现代 XSS 防御核心。示例基础策略:
add_header Content-Security-Policy "default-src 'self'; script-src 'self' https://cdn.example.com; object-src 'none'; base-uri 'self'; form-action 'self';" always;
关键点:禁用'unsafe-inline'和'unsafe-eval',明确允许的脚本来源。 -
X-Frame-Options:防御点击劫持。常用值:
add_header X-Frame-Options "SAMEORIGIN" always;(同源可嵌入)
或add_header X-Frame-Options "DENY" always;(完全禁止嵌入)
若需兼容百度统计等第三方 iframe 工具,可用ALLOW-FROM https://tongji.baidu.com。 -
X-Content-Type-Options:防止浏览器 MIME 嗅探误执行脚本:
add_header X-Content-Type-Options "nosniff" always; -
X-XSS-Protection:已逐步弃用,仅作辅助。如启用,推荐阻断模式:
add_header X-XSS-Protection "1; mode=block" always;
在请求入口处做简单过滤(可选增强)
虽不能替代应用层过滤,但可在 Nginx 层快速拦截明显恶意请求,减轻后端压力:
- 屏蔽含典型 XSS 载荷的查询字符串:
if ($query_string ~* "(%3C|%3E|script|javascript|alert|onerror|onload)") { return 403; } - 限制 User-Agent 中的危险关键词(针对自动化扫描器):
if ($http_user_agent ~* "(%3C|%3E|eval|document\.cookie)") { return 403; } - 注意:
if在 location 外使用有局限,建议放在server块顶层,并确认 Nginx 版本支持。
配套基础安全配置(不可忽略)
单独加安全头不够,还需关闭信息泄露和默认风险:
- 隐藏 Nginx 版本与服务器标识:
server_tokens off;(放在http或server块) - 禁用目录列表(防配置/日志文件暴露):
autoindex off; - 禁止访问隐藏文件(如 .git、.env):
location ~ /\. { deny all; }
验证是否生效
配置后务必验证响应头是否真实返回:
- 用命令行检查:
curl -I https://your-domain.com
查看输出中是否包含Content-Security-Policy、X-Frame-Options等字段,且状态码不是 500。 - 打开浏览器开发者工具 → Network → 刷新页面 → 查看任意 HTML 请求的 Response Headers。
- 特别留意 404 页面是否也携带这些头——这是很多配置遗漏的关键点。


















