如何检测嵌入我方网站内容的站点适配X-Frame-Options配置
部署X-Frame-Options前排查第三方站点嵌入的实操方法
以下是经过生产验证的排查方案,覆盖绝大多数嵌入场景,能最大程度避免配置安全头后出现合法嵌入被拦截的问题:
- 服务端访问日志回溯筛查
所有现代浏览器发起的iframe嵌入请求,都会自动携带Sec-Fetch-Dest: iframe请求头,你可以直接筛选近3-6个月的服务端访问日志,把带该请求头、且请求来源(Origin/Referer)不属于你方自有域名的记录全部捞出来,统计对应的外站域名、被嵌入的页面路径、访问频次。
针对不支持Sec-Fetch系列头的老旧浏览器,可以补充筛选Referer为外站域名、且请求资源为非接口类页面的记录,和前面的结果合并去重。注意回溯周期不要短于3个月,否则低频访问的嵌入场景很容易被遗漏。 - 前端埋点全量采集
不要直接全量上线安全头,先花1-2周时间做前置采集:在所有站点公共页面插入轻量检测脚本,当识别到页面被非本站域名字面嵌入时,自动上报嵌入方域名。参考代码如下:
if (window.top !== window.self) { try { const embedOrigin = new URL(document.referrer).origin; const selfOrigin = window.location.origin; if (embedOrigin && embedOrigin !== selfOrigin) { // 替换为站点自有埋点上报接口 fetch('/api/log/embed-record', { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify({ targetPage: window.location.pathname, embedOrigin: embedOrigin, accessTime: Date.now() }), credentials: 'same-origin' }); } } catch (err) { // 捕获跨域访问异常,不影响页面正常运行 } }
这种方式能抓到日志筛选可能漏掉的特殊嵌入场景,采集周期越长,长尾的低流量嵌入场景覆盖越全。
- 内部合作记录交叉校验
拉通商务、产品、客户服务侧的对外合作台账,把所有合同、合作协议中明确约定允许嵌入我方站点内容的合作方域名整理出来,和前面日志、埋点采集到的域名清单做比对,补全漏采的合作方场景,尤其是那些仅合作方内部使用、访问量极低的嵌入页面。 - 上线灰度缓冲
清单梳理完成后,不建议直接一刀切配置X-Frame-Options: DENY或X-Frame-Options: SAMEORIGIN。如果需要兼容多域名合法嵌入,优先使用灵活性更高的Content-Security-Policy: frame-ancestors 'self' 合法域名1 合法域名2响应头;如果必须兼容老旧浏览器使用X-Frame-Options,可以先按允许清单配置规则,上线后持续观察2周拦截日志,确认没有误拦合法请求后再逐步收紧策略。
提示:不要依赖第三方搜索引擎类工具排查嵌入场景,这类工具的爬虫覆盖范围极有限,绝大多数真实业务场景下的嵌入都无法被抓取到,很容易出现漏判。
内容的提问来源于stack exchange,提问作者Yash Gandhi
相关产品推荐
相关产品推荐

