浏览器 Web 安全基础系列
HTTPS 为什么仍然不够(当前篇)
HTTPS 不是“网址前多了一个 s”,而是浏览器与服务器通过 TLS 建立加密和身份认证通道。它保护传输中的 Cookie、密码和响应内容,降低窃听与篡改风险。但仅配置证书还不够,还要处理 HTTP 入口、Secure Cookie 和混合内容。

HTTPS 主要解决三个问题
机密性:中间网络无法直接读出请求和响应正文。
完整性:传输内容被修改时,连接校验会失败。
服务器身份认证:浏览器通过证书链确认正在连接的域名。
HTTPS 不会自动修复 XSS、CSRF、越权和 SQL 注入。它保护的是传输通道,而不是应用业务逻辑。
301 跳转仍有首次 HTTP 请求
常见配置:
http://example.com
→ 301 https://example.com
问题是用户第一次输入 HTTP 地址时,请求已经通过明文网络发出。中间人可能在浏览器收到 301 前篡改响应。
HSTS 响应头告诉浏览器:未来一段时间内,这个域名只允许 HTTPS:
Strict-Transport-Security: max-age=31536000; includeSubDomains
浏览器保存策略后,即使用户输入 http://,也会在网络请求前升级为 HTTPS。
Node.js 示例:
app.use((req, res, next) => {
res.setHeader(
'Strict-Transport-Security',
'max-age=31536000; includeSubDomains'
);
next();
});
HSTS 只有通过 HTTPS 响应收到时才可信。HSTS Preload 可以进一步处理首次访问,但加入前必须确认整个域名及子域名长期支持 HTTPS,退出预加载列表也不是即时生效。
Secure Cookie
登录 Cookie 应设置:
Secure
它阻止浏览器通过普通 HTTP 发送 Cookie。但 Secure 不是加密 Cookie 内容,也不能替代 HTTPS。Cookie 值仍可能在客户端存储中可见,服务端不要把密码等敏感明文直接放进 Cookie。
混合内容
HTTPS 页面加载 HTTP 资源称为混合内容:
<script src="http://cdn.example.com/app.js"></script>
如果脚本通过 HTTP 加载,中间人可以替换脚本,进而控制整个 HTTPS 页面。浏览器通常会阻止这类“主动混合内容”。

图片、音频等某些资源可能被自动升级或限制,但不应依赖浏览器兜底。项目中应统一使用 HTTPS 或相对协议无关的站内路径:
<script src="https://cdn.example.com/app.js"></script>
<img src="/images/banner.webp" alt="">
反向代理下的 HTTPS 判断
Node.js 服务部署在 Nginx、CDN 或负载均衡器后时,应用与代理之间可能是 HTTP,但用户侧是 HTTPS。需要正确配置可信代理,避免错误重定向或错误生成 Cookie:
app.set('trust proxy', 1);
app.use((req, res, next) => {
if (!req.secure) {
return res.redirect(308, `https://${req.headers.host}${req.url}`);
}
next();
});
trust proxy 不能盲目开启,必须与真实代理拓扑匹配,否则攻击者可能伪造转发头。
开发环境证书
本地 HTTPS 实验可以使用自签名证书。浏览器会提示证书不受信任,这是因为它不在系统信任链中,不代表 TLS 加密完全没有发生。生产环境必须使用受信任 CA 签发、域名匹配且未过期的证书。
常见误区
有 HTTPS 就不用 HttpOnly 和 SameSite
不对。HTTPS 防网络窃听;HttpOnly 防 JavaScript 直接读 Cookie;SameSite 限制跨站携带。它们保护不同层面。
所有内容都加密,所以日志里也安全
TLS 只保护网络链路。服务端、代理、APM 和访问日志仍可能记录查询参数、请求头和正文,敏感信息不要放进 URL。
HSTS 可以防所有中间人攻击
HSTS 主要强制 HTTPS,前提是证书体系和终端环境可信;它不能修复应用代码漏洞。
小结
生产 Web 应用至少应做到:全站 HTTPS、HTTP 重定向、登录 Cookie 使用 Secure、逐步启用 HSTS、清理混合内容,并正确处理反向代理。TLS 是其他安全机制成立的底座,但不是完整的应用安全方案。
参考资料
https://developer.mozilla.org/en-US/docs/Web/Security/Transport_Layer_Security
https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Strict-Transport-Security
https://developer.mozilla.org/en-US/docs/Web/Security/Defenses/Mixed_content
https://cheatsheetseries.owasp.org/cheatsheets/Transport_Layer_Security_Cheat_Sheet.html
HTTPS 为什么仍然不够:TLS、HSTS 与混合内容
https://lautung.com/archives/web-security-04-https-hsts
评论