必须在服务端配置x-frame-options: deny或content-security-policy: frame-ancestors 'none'来禁止dify应用被iframe嵌套,nginx中添加add_header x-frame-options "deny" always;并重载配置验证生效。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

防止Dify部署的聊天应用被恶意网站用iframe嵌套实施点击劫持,必须在服务端强制拒绝非授权嵌入,不能依赖前端JavaScript或iframe sandbox属性补救。
通过HTTP响应头禁止任意嵌套
在Dify后端服务(如Nginx、Apache或Django)中配置X-Frame-Options响应头为DENY,这是最基础且不可绕过的防线。
以Nginx为例,在server块中添加:add_header X-Frame-Options "DENY" always;
该指令会向所有响应注入X-Frame-Options: DENY,浏览器收到后将直接阻止任何站点(包括同域页面)用iframe加载你的Dify应用。这一步不做,后续所有安全措施都形同虚设。
用CSP frame-ancestors替代X-Frame-Options
方法一:全局禁用嵌套
在响应头中设置Content-Security-Policy: frame-ancestors 'none';,效果等同于X-Frame-Options: DENY,但更现代、更可靠。
方法二:仅允许指定可信域名嵌入
若需开放给自家主站嵌入(例如https://app.yourcompany.com),则配置:Content-Security-Policy: frame-ancestors 'self' https://app.yourcompany.com;
【注意:'self'不包含子域名,https://dashboard.yourcompany.com不在白名单内】
方法三:兼容旧版IE的兜底写法
同时设置两个响应头:X-Frame-Options和Content-Security-Policy。IE只认前者,Chrome/Firefox/Safari优先读后者,二者叠加可覆盖全部主流浏览器。
禁用Dify前端的iframe嵌入能力
第一步:确认Dify部署模式
若使用Docker Compose部署,默认暴露的是完整Web应用;若使用Dify Cloud托管版,则无法修改响应头——此时必须改用自托管方式,否则无法生效。
第二步:修改Nginx配置文件
找到Dify服务反向代理所在location块,插入add_header指令,确保它位于proxy_pass之后、且未被其他location覆盖。
第三步:重载Nginx配置
执行nginx -t && nginx -s reload,验证响应头是否已生效:打开浏览器开发者工具→Network→任意请求→Response Headers→检查是否存在frame-ancestors或X-Frame-Options字段。
第四步:手动测试嵌套行为
新建一个HTML文件,写入<iframe src="https://your-dify-app.com/chat"></iframe>,在本地打开。若iframe区域为空白且控制台报错“Refused to display”,说明策略已生效。











