Mac Zoom 漏洞的曝出将 CORS(跨源资源分享,Cross Origin Resource Sharing)拉入了大众视野,但是坦白地讲,“不了解 CORS 的 Web 开发人员实在太多了”——无论是新手还是经验丰富的开发人员。

那么是因为 CORS API 过于复杂和混乱?还是说开发者需要围绕 CORS 和 CSP 等问题对开发人员展开更好的教育?......无论是何种情况,这都不是忘记过滤数据源的正当理由。

声明:本文已获作者 Chris Foster 翻译授权。

作者 | Chris Foster

译者 | 弯月,责编 | 郭芮

出品 | CSDN(ID:CSDNnews)

以下为译文:

从事全栈技术咨询工作的最大优势就在于,我可以与大量来自各个行业、不同规模、不同技术水平的开发人员合作。这是一个了解“民间疾苦”的良机。最近我发现了一个普遍的问题:不了解CORS(Cross Origin Resource Sharing,跨源资源分享)工作原理的Web开发人员实在太多了。

鉴于最近的Zoom漏洞,我觉得应该及时指出这个问题。安全研究员Jonathan Leitschuh发现Zoom会在本地启动一个Web服务器监听http://localhost:19421。当你加载Zoom的链接时,Zoom网站会向localhost的Web服务器发送请求,并指示它打开本地的Zoom应用。

Jonathan Leitschuh介绍表示(在CSDN此前发布的《Mac 被曝存在恶意漏洞:黑客可随意调动摄像头,波及四百万用户!》一文中也曾详细报道过):

我还发现,该页面发出的不是常规的AJAX请求,而是从在本地运行的Zoom Web服务器中加载图像,图像的尺寸代表不同的服务器错误/状态代码。

其中的case-switch逻辑如下:

让我感到费解的一个问题是,为什么这个Web服务器会返回通过图像文件的尺寸编码的数据?原因在于,这样做可以绕过跨源资源分享(Cross Origin Resource Sharing,即CORS)。实际上浏览器会有意忽略localhost上运行的服务器的所有CORS策略。

——上述最后一句话不正确,因为Chrome确实会遵循localhost Web服务器的CORS头。

如果你是一名Web开发人员,那么当你使用前端应用创建的React应用在某个端口上,而你的后台API在另一个端口上时,你很可能也遇到过这种情况。你的应用会对localhost发出跨源请求,而且所有浏览器都支持该功能。

在我看来,Zoom在发布这个功能的时候并不理解CORS。如果浏览器禁止这种操作,那么他们也就无法发送这样的AJAX请求。相反,他们利用图像绕开了CORS问题。然而,他们的这种做法实际上在Zoom中埋下了一个重大漏洞,因为不仅Zoom网站可以触发本机客户端的操作并访问响应,互联网上的任何其他网站也可以。

那么怎样才能安全地实现这个功能呢?监听localhost:19421的Web服务器应该实现REST API,并将Access-Control-Allow-Origin头设置为https://zoom.us。这样就可以确保只有在zoom.us域上运行的JavaScript才能与localhost的Web服务器通信。此外,为了制止页面自动在后台打开zoom.us,还应该设置一个能够阻止iframe渲染的内容安全策略(Content Security Policy,即CSP)头。

即便如此,仍然还有一个漏洞:任何页面都可以将浏览器重定向到zoom.us链接,让你意外闯入一个陌生的会议。但这是Zoom设计的用户体验,并非软件漏洞问题。就个人而言,我认为这种方法也不正确。他们曾提到他们希望通过直接打开应用程序来增强用户体验,但良好的用户体验设计规则之一就是软件的行为应该在用户的预料之中。

我可不希望在点击一个链接的时候,突然与不认识的人视频。Zoom打破了用户的这种期望,即使出于用户体验的原因,他们不希望浏览器显示内置的弹出窗口,他们也应该在应用中显示此弹出窗口!Google Meet就是这么做的:

让我们重回CORS的话题。姑且不论用户体验如何,在localhost上运行Web服务器都存在风险。绝对不应该为互联网上的每个网站提供访问某些功能的特权,例如安装软件。CORS可以确保这种安全性,所以千万不要绕开CORS!

我不清楚Zoom采用这种方式实现该功能的原因究竟是不是他们没理解CORS。但是,我与多个人进行了交谈,我们都认为除此之外没有其他合理的理由来解释他们的这种实现。在Reddit上,lerunicorn有了新的发现,他说Firefox可以阻止从安全的位置引用非安全数据源的XHR,这可以解释Zoom采用这种实现背后的动机。但是,即使数据源是localhost,Firefox也支持该功能。或者,还可以让本地应用生成唯一的自签名证书。再不济还可以使用浏览器扩展。无论是何种情况,这都不是忘记过滤数据源的正当理由。

不仅仅是Zoom,很多与我有过交谈的开发人员也都不了解CORS的工作原理。Stack Overflow上就有很多这类的例子。不幸的是,很多问题的答案推荐的都是非常不安全的默认设置,比如这一段ExpressJS的代码(https://enable-cors.org/server_expressjs.html),如果你完全复制的话,你的应用程序就很容易受到攻击。其他软件开发商也有与Zoom相同的漏洞。

开发人员只是想让他们的代码运行起来,而绕过同源策略代码恰巧能让程序运行,因此才出现了Zoom如今的局面。

无论是新手还是经验丰富的开发人员,都可能不太理解CORS。是不是因为CORS API过于复杂和混乱?还是说我们需要围绕CORS和CSP等问题对开发人员展开更好的教育?我不确定,但从目前的形式来看,我们还需要加倍努力。

原文:https://fosterelli.co/developers-dont-understand-cors

作者:ChrisFoster,软件工程师@Two Story Robot。

想要入坑机器学习?这是MIT在读博士的AI心得

https://edu.csdn.net/topic/ai30?utm_source=csdn_bw

【End】

不可不知的 5 种 JavaScript 代码编辑器5G 会榨干手机的电池?☞北上深人均月薪超 2 万元,清华近三成毕业生年入 50 万+,5G 人才月薪超 4 万吴军:站在浪潮之巅,5G 和 IoT 才是未来 10 年的浪潮 | 人物志入门必备 | 盘点11个常用的区块链开发工具,年薪百万的工程师都是从玩转它们开始的如何从零开始设计一颗芯片?200行代码解读Github冠军项目背后的定时器自然语言处理十问!独家福利为什么雷军说“华为不懂研发”?

点击阅读原文,输入关键词,即可搜索您想要的 CSDN 文章。

你点的每个“在看”,我都认真当成了喜欢

出于安全考虑,千万不要绕开 CORS!相关推荐

  1. [转]项目方面的做人处事

    项目方面的做人处事 一项目计划: 1.项目计划并不是一边将自己所熟悉的工作内容留给自己一边不停的说这个工作量太大,让MM来协助,你要这样的话我建议你当老总找个秘书. 2.开会:   开会的目的是解决问 ...

  2. 【转】墨完巴的传奇一生

    为什么80%的码农都做不了架构师?>>>    一个写现在网络小说的文章,特有意思: 熟读网络小说300篇,不会写书也会编. 首先,主角有一个响亮无比的名字: 墨罕墨得.完颜汤姆.巴 ...

  3. k8s二进制集群部署安装文档

    一.架构拓扑图 版本信息: kubernetes v1.18.20/ etcd-v3.4.21 docker 18.09.9-3.el7 calico/node v3.8.9 安装所需要镜像: har ...

  4. HTTP访问控制(CORS)

    跨站 HTTP 请求(Cross-site HTTP request)是指发起请求的资源所在域不同于该请求所指向资源所在的域的 HTTP 请求.比如说,域名A(http://domaina.examp ...

  5. 【SpringMVC】与权限拦截器冲突导致的Cors跨域设置失效问题

    问题描述 前端域名FE.com向后端域名BE.com分别请求访问优惠券的列表和提交新增的优惠券,API设计所用的Method分别为Get和Post,结果为前一次访问成功而后一次访问失败.这两次请求都是 ...

  6. 可怕!315 曝光 50 多款App“窃听”:这条黑色产业链,有人靠你的隐私年赚千万...

    文 | 杨丽 编辑 | 李阳阳 来源 | 创业邦(ID:ichuangyebang) 2020年315晚会点名多款APP上演"窃听风云",违规盗取个人隐私信息,让人不寒而栗! 它们 ...

  7. mysql对于大表(千万级),要怎么优化呢?

    提问:如何设计或优化千万级别的大表?此外无其他信息,个人觉得这个话题有点范,就只好简单说下该如何做,对于一个存储设计,必须考虑业务特点,收集的信息如下: 1.数据的容量:1-3年内会大概多少条数据,每 ...

  8. 我是如何在SQLServer中处理每天四亿三千万记录的

    原文地址:http://www.cnblogs.com/marvin/p/HowCanIHandleBigDataBySQLServer.html 首先声明,我只是个程序员,不是专业的DBA,以下这篇 ...

  9. [项目实施失败讨论Case] “凭心而论,在这家公司很敬业的工作了3年多,老板最后给我下的评语,大家都看看吧,千万别和我走同一条路!”(摘自csdn)...

    [Case] "凭心而论,在这家公司很敬业的工作了3年多,老板最后给我下的评语,大家都看看吧,千万别和我走同一条路!"(摘自csdn) 原文:http://community.cs ...

最新文章

  1. Rosalind: 兔子与递归
  2. Do not wait until the conditions are perfect to begin. Beginning makes the conditions perfect(转)...
  3. hibernate中的id特殊属性hilo剖解(多用于继承关系)
  4. shell循环,判断介绍,以及实例
  5. 可串联使用的模10计数器
  6. golang之正则校验(验证某字符串是否符合正则表达式)
  7. asp.net 从客户端中检测到有潜在危险的 Request.Form 值
  8. FishC笔记—33 讲 异常处理:你不可能总是对的2
  9. matlab串口实时画图,基于MATLABGUI界面的MCU串口实时绘图设计
  10. 用 Python 写出 Gameboy 模拟器,这位丹麦小哥的大学项目火了!
  11. 要写好综述类论文?这几个点你需要注意
  12. 同工作组计算机连接用户名和密码错误,登录失败: 未知的用户名或错误密码
  13. 音视频 开发技术,让智能家居更智能!
  14. 4键电子手表说明书_4键sport电子表使用说明书,按START键可循环选择12/24小时显示格式...
  15. 网管服务器系统巡检报告,网络设备巡检报告-20210730125215.docx-原创力文档
  16. 【知识兔】Ctrl+H,Word文档中超好用的快捷键
  17. containerd
  18. 微信小程序 语音录制功能和文件(ppt、word、excel、pdf、txt格式)上传
  19. 网易租赁服务器怎么添加组件,《我的世界》租赁服添加MOD教程 租赁服怎么添加小精灵MOD?...
  20. 7.26 3 教育的长久回报期

热门文章

  1. HDFS文件权限不足导致Sqoop执行失败
  2. 【数据结构】【未完成】单调栈
  3. 模型可视化工具netron
  4. python自定义类型转换_Python JSONDecoder自定义null类型的转换
  5. python seaborn boxplot_seaborn.boxplot
  6. LeetCode 题练习记录
  7. 【QT】QT从零入门教程(十七):QT+OpenCV+VS 打包exe
  8. 通过Docker Cloud部署应用
  9. 碱度控制化学品行业调研报告 - 市场现状分析与发展前景预测
  10. 2021年中国低密度PET泡沫市场趋势报告、技术动态创新及2027年市场预测