点击劫持是一种通过透明或伪装iframe覆盖正常页面诱导用户点击的攻击手段,防御的核心是在服务端响应头中限制页面被嵌入的范围。配置时,`x-frame-options` 用于兼容旧浏览器,设置 `deny` 禁止所有嵌入,设置 `sameorigin` 仅允许同源页面嵌入;现代浏览器推荐使用 `content-security-policy` 的 `frame-ancestors` 指令,它支持更精细的同源、特定域名或自嵌控制。正确配置后,非授权来源的页面将无法在当前窗口内加载该资源,从而阻断攻击。

X-Frame-Options 的具体配置选项有哪些
`X-Frame-Options` 有三个标准值:`DENY`、`SAMEORIGIN` 和 `ALLOW-FROM`(已废弃)。`DENY` 表示任何页面都不能将其作为iframe加载,这是最严格的保护;`SAMEORIGIN` 允许与当前页面同源的页面进行嵌入,适用于需要内部框架集成的场景;`ALLOW-FROM` 曾用于指定允许嵌入的特定URI,但由于CSP的普及和浏览器兼容性差,现已不推荐。在实际部署中,通常优先使用 `SAMEORIGIN` 或 `DENY`,具体取决于业务是否允许其他页面嵌入。

X-Frame-Options: SAMEORIGIN
上述配置允许同源页面嵌入,若需完全禁止,则改为 `DENY`。注意,`ALLOW-FROM` 在Chrome 51+、Firefox 49+等现代浏览器中已被忽略,应迁移至CSP。
Content-Security-Policy frame-ancestors 如何配置
`Content-Security-Policy` (CSP) 的 `frame-ancestors` 指令是 `X-Frame-Options` 的现代替代方案,提供更灵活的嵌入控制。其语法为 `frame-ancestors 'self' | 'none' | uri-list`。`'self'` 允许同源嵌入,`'none'` 等同于 `DENY`,`uri-list` 可指定具体的域名列表,如 `'https://example.com'`。CSP的优势在于支持多值、通配符(如 `*.example.com`)以及更细粒度的权限控制,且被所有现代浏览器广泛支持。

Content-Security-Policy: frame-ancestors 'self' https://trusted.example.com;
此配置允许同源页面及 `https://trusted.example.com` 嵌入。若需禁止所有嵌入,使用 `frame-ancestors 'none';`。注意,CSP头部需与服务端正确配置,且需确保无其他策略冲突。
当同时存在 X-Frame-Options 和 CSP frame-ancestors 时以哪个为准
当两个头部同时存在时,现代浏览器会优先遵循 `Content-Security-Policy` 中的 `frame-ancestors` 指令,而忽略 `X-Frame-Options`。这是因为CSP是更强大、更灵活的标准,且 `X-Frame-Options` 已被标记为过时。因此,最佳实践是只配置CSP的 `frame-ancestors`,并移除 `X-Frame-Options` 以避免混淆。但在某些遗留系统中,可能仍需保留 `X-Frame-Options` 以兼容极老版本的浏览器,此时应确保两者策略一致,例如都设置为 `DENY` 或 `SAMEORIGIN`。











