静态页面常被误认为天然免疫攻击,实际上静态资源服务器、CDN边缘节点、HTML内嵌脚本和表单处理接口都可能成为突破口。静态页面的“静”只代表文件本身不动态拼接,不代表服务器不解析请求头、不处理HTTPS握手、不响应异常方法。攻击者可以通过HTTP方法探测、路径穿越、恶意爬虫、慢速连接、CC请求等方式耗尽静态节点的连接池或触发源站回源,因此静态页面防护必须与动态流量攻击防御叠加使用,形成“文件层收紧、流量层识别、行为层拦截”的组合策略。

静态页面常见漏洞与加固方法

静态站最容易被忽视的问题是Web服务器默认配置过宽。Nginx、Apache、OpenLiteSpeed等软件即使只返回HTML和JS文件,也会默认支持TRACE、OPTIONS、PUT等HTTP方法。攻击者利用OPTIONS可以枚举服务器支持的请求方式,利用TRACE可能触发反射型跨站追踪,利用PUT在部分错误配置下甚至能写入文件。加固的第一步是在服务器配置中显式拒绝非必要方法,仅保留GET、HEAD和POST,并对POST接口做路径白名单限制。

# Nginx 示例:仅允许 GET、HEAD、POST,并拦截其他方法
if ($request_method !~ ^(GET|HEAD|POST)$) {
    return 405;
}

路径穿越在静态服务器上依然存在。即使没有动态脚本,编码后的URL如“%2e%2e%2f”或双写“....//”仍可能绕过WAF或CDN缓存规则,访问到备份文件、配置文件或私密目录。服务器应启用规范化路径解析,禁止URL中出现未解码的点段,并限制访问文件后缀。对于纯静态站点,可以直接配置只允许访问特定扩展名,例如html、css、js、jpg、png、svg、webp、ico、txt、xml,其余后缀一律返回403。

静态页面中的JavaScript容易成为存储型漏洞的载体。很多静态站会从URL参数中读取值并渲染到页面,例如搜索词回显、分享标题、跳转地址等。如果这些值未经转义就写入DOM,攻击者可以构造带恶意脚本的链接,诱导用户点击后窃取Cookie或执行钓鱼操作。即使页面是静态HTML,只要内嵌脚本处理了外部输入,就存在DOM型XSS风险。修复方式是在前端输出时统一使用textContent或innerText,避免使用innerHTML拼接外部数据,同时配合CSP策略限制脚本来源。

// 不安全写法
document.getElementById('result').innerHTML = location.search.substring(1);

// 安全写法
document.getElementById('result').textContent = location.search.substring(1);

静态资源服务器还容易遭遇目录遍历和信息泄露。如果关闭了自动索引但未正确配置错误页,攻击者仍可通过请求不存在的路径获取服务器版本信息。更严重的是,部分站点会遗留.git、.svn、.DS_Store、备份压缩包等敏感文件。攻击者使用工具批量扫描这些路径,一旦命中就能下载整站源码或还原目录结构。防护措施包括在服务器层屏蔽所有以点开头的隐藏文件请求,对敏感后缀返回404而非403,避免暴露文件是否存在,并定期用爬虫模拟攻击路径做自查。

动态流量攻击对静态站的威胁

静态站虽然不查数据库,但每次请求依然消耗TCP连接、TLS握手资源、带宽和CDN流量。CC攻击不需要复杂的动态脚本漏洞,只要用大量代理IP持续请求首页或大体积静态资源,就能让源站带宽跑满或CDN账单暴涨。更隐蔽的是慢速攻击,攻击者建立大量连接后以极慢速度发送请求头,占用服务器连接池,导致正常用户无法建立新连接。静态站必须把这些流量层攻击与文件层漏洞分开处理,文件层解决“请求是否合法”,流量层解决“请求是否恶意”。

动态流量攻击防御的落地方式

第一层防御在边缘节点完成。CDN服务商通常提供基础DDoS防护和CC防护,但默认阈值往往较宽,需要根据站点实际流量模型调整。静态站应开启限速规则,按IP和会话维度限制请求频率,例如单IP每秒不超过20次请求,超过后返回429或跳转验证码。对于图片、视频等大文件,可以设置单连接下载限速,防止单个攻击源占用过多带宽。同时启用CDN的智能压缩和缓存保持功能,减少回源次数,让攻击流量尽可能在边缘被吸收。

第二层防御在源站服务器。即使前面有CDN,攻击者仍可能通过查找源站真实IP直接发起攻击。源站应配置连接数限制和请求速率限制,Nginx的limit_conn和limit_req模块可以精确控制单个IP的并发连接数和请求速率。对于静态资源,可以开启sendfile、tcp_nopush和gzip压缩,减少CPU和带宽消耗。同时设置合理的keepalive超时时间,避免慢速连接长时间占用工作进程。

# Nginx 示例:限制单IP并发连接数为20,请求速率为每秒10次
limit_conn_zone $binary_remote_addr zone=conn_perip:10m;
limit_req_zone $binary_remote_addr zone=req_perip:10m rate=10r/s;

server {
    limit_conn conn_perip 20;
    limit_req zone=req_perip burst=20 nodelay;
}

第三层防御是行为识别。单纯的频率限制容易误伤正常用户,尤其是企业出口共享IP或移动网络用户。更有效的做法是结合请求特征进行判断。攻击流量通常具有固定的User-Agent、缺少Referer、请求路径集中、请求间隔均匀等特征。可以在服务器层或WAF中配置规则,对无Referer的POST请求直接拦截,对短时间内请求大量不存在路径的IP加入临时黑名单,对User-Agent为空的请求提高验证门槛。静态站还可以利用JavaScript挑战,在首次访问时要求浏览器执行一段脚本并回传结果,能有效过滤掉大部分脚本化攻击工具。

静态页面与动态防御的联动策略

静态页面防护和动态流量防御不能割裂。一个典型的攻击链是:攻击者先扫描静态站目录寻找敏感文件,找到后下载源码分析漏洞,再针对发现的接口发起CC或慢速攻击。如果文件层防护足够严格,攻击者拿不到有效信息,后续攻击成本会大幅上升。反过来,如果流量层防护能识别扫描行为并及时封禁,攻击者连目录结构都摸不清。两者叠加后,攻击者需要同时绕过路径限制、方法限制、频率限制、行为识别和前端挑战,难度成倍增加。

具体实施时,建议先梳理站点的资源类型和访问路径。纯展示类页面只允许GET请求,关闭所有表单和上传功能;需要交互的页面单独划分路径前缀,例如/api/或/contact/,对这些路径单独配置POST白名单和更严格的限速规则。静态资源目录如/images/、/css/、/js/可以设置长缓存和宽松的频率限制,因为正常用户会大量并行加载这些文件,过严的限速反而影响体验。首页和HTML文件则设置中等限速,防止攻击者反复请求造成回源压力。

日志分析是联动策略的关键环节。静态站应开启详细访问日志,记录请求方法、路径、状态码、User-Agent、Referer和请求耗时。通过分析日志可以发现异常模式,例如某个IP在短时间内请求了大量404路径,说明可能在进行目录扫描;某个IP的请求耗时异常长,可能是慢速攻击;某个User-Agent的请求量突然激增,可能是新出现的攻击工具。将这些特征提取出来,反哺到WAF规则和服务器配置中,形成持续优化的闭环。

容易被忽略的细节

静态站的HTTPS配置同样影响安全性。过旧的TLS版本和弱加密套件可能被中间人攻击利用,篡改静态页面内容注入恶意脚本。应关闭TLS 1.0和1.1,仅启用TLS 1.2和1.3,并优先使用AEAD加密套件。同时开启HSTS头,强制浏览器使用HTTPS访问,防止降级攻击。证书私钥要妥善保管,避免放在可公开访问的目录中。

CDN缓存策略如果配置不当,可能缓存了不该缓存的内容。例如将包含用户信息的接口响应缓存到边缘节点,导致其他用户看到他人数据。静态站应明确区分可缓存和不可缓存的路径,对HTML文件设置较短的缓存时间或使用协商缓存,对带Cookie的请求设置Cache-Control: private,对图片、CSS、JS等资源设置长缓存并配合版本号或哈希值更新。

前端资源自身也可能引入安全风险。第三方统计脚本、广告代码、字体库、CDN引用的JavaScript库都可能被供应链攻击利用。静态站应尽量将第三方资源下载到本地托管,避免依赖外部域名的可用性和安全性。对于必须使用的外部资源,添加SRI完整性校验属性,确保资源内容未被篡改。同时定期检查引用的库是否存在已知漏洞,及时升级版本。

综合来看,静态页面漏洞防护与动态流量攻击防御是静态站安全的两条腿。文件层防护解决“静态页面本身可以被攻击的弱点”,流量层防护解决“攻击者用流量手段耗尽资源的威胁”。两者结合后,再配合日志分析和持续调优,才能让静态站在面对自动化扫描、CC攻击、慢速连接、恶意爬虫等威胁时保持稳定运行。安全配置不是一次性工作,攻击手法不断变化,防护规则也需要根据实际流量和日志数据持续更新。