当前位置:首页 > 综合

如何防止网页被劫持

去年秋天,何防我帮一个做独立博客的止网朋友排查问题。他跟我说,页被网站流量突然掉了七成,劫持搜索引擎收录的何防页面标题全变成了“博彩推荐”。打开源码一看,止网页面底部被塞了一段经过混淆的页被JavaScript,每次加载都会动态注入赌博链接。劫持这不是何防服务器被黑,而是止网他用的某个免费CDN节点被污染了——典型的网页劫持。

网页劫持说白了,页被就是劫持攻击者在用户和网站之间插了一脚。你看到的何防页面,不一定是止网服务器真正返回的那个。常见手法有三种:DNS劫持、页被HTTP劫持、以及内容注入。DNS劫持发生在域名解析阶段,攻击者控制或伪造DNS响应,把域名指向自己的服务器。HTTP劫持更常见,尤其在公共Wi-Fi下,网关直接篡改HTTP响应内容。内容注入则更隐蔽,比如运营商在页面里插广告,或者恶意浏览器插件往DOM里塞代码。

我见过最粗暴的案例,是某地运营商在用户访问任何HTTP网站时,强行在页面顶部插入一个悬浮广告条。用户投诉到工信部,最后不了了之。这事靠用户端解决不了,得网站自己上HTTPS。

HTTPS是防劫持的第一道硬防线。TLS加密之后,中间人没法篡改内容,因为一改就校验失败。但光有HTTPS还不够,你得配HSTS(HTTP Strict Transport Security)。HSTS告诉浏览器:以后这个域名只用HTTPS访问,别走HTTP。没有HSTS,攻击者可以先把用户降到HTTP,再劫持。HSTS Preload List更狠,直接把域名写进浏览器源码,连第一次请求都强制HTTPS。我自己的几个站都提交了Preload,虽然流程慢,但省心。

另一个容易忽略的点是DNS。很多站长图方便,用域名注册商默认的DNS服务器。那些DNS服务器可能被污染,或者响应慢。换成Cloudflare、Google DNS、或者自建DNS,能减少DNS劫持概率。DNSSEC也能用,但部署麻烦,中小站长很少碰。更实际的做法是:用可信DNS服务商,再配合CAA记录限制哪些CA能给你签证书。

内容安全策略(CSP)是防注入的利器。CSP通过HTTP头告诉浏览器:只允许加载哪些域的脚本、样式、图片。比如你设置script-src 'self',那浏览器就只执行同源脚本,攻击者注入的第三方JS直接失效。我朋友的博客后来加了CSP,虽然调的时候麻烦——他用了内联脚本和几个外部统计——但调好之后,再也没出现过注入。

子资源完整性(SRI)也值得提。如果你引用了CDN上的jQuery,加个integrity属性,浏览器会校验文件哈希。CDN被投毒?哈希对不上,浏览器直接拒绝加载。这招对供应链攻击很有效。

还有个小细节:Cookie安全。给Cookie加上Secure和HttpOnly属性,防止被JavaScript读取,也防止在HTTP下发送。再配合SameSite=Lax,能挡掉不少CSRF和劫持后的会话窃取。

最后说个观察:很多劫持事件不是技术对抗失败,而是站长根本不知道自己的站被劫持了。我建议每个站长都装个监控,比如用UptimeRobot或者自建脚本,定期抓取页面,检查标题和关键内容有没有被篡改。发现异常,立刻查DNS、查CDN、查服务器日志。别等流量掉光了才反应过来。

防劫持没有一劳永逸的方案。攻击者在进化,运营商的小动作也没停过。但把HTTPS、HSTS、CSP、SRI这几样配齐,能挡住九成以上的常见劫持。剩下的,靠监控和快速响应。

分享到: