2025上半年,最新 AI实践都在这!20+ 应用案例,任听一场议题就值回票价 了解详情
写点什么

为什么 StackOverflow 上的代码片段会摧毁你的项目

  • 2020-11-27
  • 本文字数:2585 字

    阅读完需:约 8 分钟

为什么StackOverflow上的代码片段会摧毁你的项目

本文最初发布于Mahdhi Rezvi个人博客,经原作者授权由 InfoQ 中文站翻译并分享。


在 StackOverflow 上你会惊奇地发现,上面分享的一些解决常见问题的代码居然存在安全漏洞。


包括我在内,现在 StackOverflow 已经成为许多程序员的救星。我们中的大部分人甚至从未访问过 StackOverflow 的主页。我们访问该网站的唯一方式,是通过谷歌搜索某个我们遇到的问题或 bug,然后直接进入该问题的讨论区。


尽管去 StackOverflow 上寻找问题解决办法的习惯很实用,但与此同时我们可能也会无意中使用一些包含严重 bug 或者安全缺陷的代码。众所周知,直接从 StackOverflow 上复制代码来用是不合适的,但开发人员仍会这么做,这里引用 Ryan Donovan 的一句话:


代码复制本身并非坏事,代码重用能提高软件开发效率。为什么已经被完美解决的问题,还要再去重新解决一次呢?但是当开发人员不加理解就去使用示例代码时,那么问题就来了。


你可能会认为那些安全恐慌都只是都市传说,但我可以向你保证并不是。


最近我遇到的几件事,引起了我对这个问题的关注,下面我把这几件事简单说明下。



插图Mateusz Kupilas提供


StackOverflow 上拷贝次数最多的 java 代码片段,一直都存在缺陷。


首次知道这个信息是在一篇博客中读到的,而这篇博客的作者正是那个 java 代码的提供者,点击这里查阅博客原文。


Andreas Lundblad 是这段代码的作者,他是 Palantir 的 Java 开发人员,同时也是 StackOverflow 上排名最高的贡献者之一,他在博客中承认了此代码的缺陷。


2018 年,Sebastian Baltes 在《实证软件工程》期刊上发表了一篇研究论文。该论文指出 Andreas 在 StackOverflow 上发布的一段 Java 代码是 StackOverflow 上被拷贝次数最多的 Java 代码,甚至被多次使用在开源项目中,在 GitHub 上至少有 6000 多个 Java 项目使用了该代码片段。


该段代码是为了回答于 2010 年发布在 StackOverflow 上的这个问题。它的功能是将字节计数转换为更易于阅读的格式。例如,它将 1024 字节转换为 1kB 或将 1048576 字节转换为 1 MB。


Andreas 在被 Sebastian Baltes 告知这段代码的惊人传播量后,重新评审了这段代码。且随后在其个人博客中发布了更正后的版本,同时在博客的最后还给出了一些有价值的建议:


  • StackOverflow 上的代码段可能存在 bug,即使它们有成千上万的赞成投票。

  • 测试所有的边缘情况,特别是从 StackOverflow 复制的代码。

  • 在复制代码时,一定要包括其来源和贡献者,当出问题时,能快速定位。


尽管这个 bug 是一个微不足道的边缘情况,只会导致对文件大小计算的不精确,但实际情况可能会更糟,我们来看更多的例子。


StackOverflow 上流行最广的 c++代码片段存在重大安全缺陷


2019 年,Morteza Verdi 等人发表了一篇研究论文。该论文指出,过去 10 年里,StackOverflow 上流行最广的 c++代码片段中有 69 个存在重大安全漏洞。这 69 个经确认易受攻击的代码片段被使用到了 2589 个 GitHub 项目中。据研究者指出,从 StackOverflow 传播到 GitHub 上的这些代码中,最常见的安全漏洞是CWE150:


CWE 是社区开发的常见软件和硬件安全缺陷列表。它是一种通用语言,是安全工具的衡量标准,同时也是缺陷识别、规避和预防的基础。


CWE150 指的是空间、元空间或控制空间出现不适当中和的情况。


该论文的研究人员还开发了一个 chrome 扩展,当开发者查看 StackOverflow 代码片段时可以提醒开发者当前阅读的代码是否存在安全漏洞。虽然这个扩展一般用途不大,不过如果感兴趣的话,可以点击这里查看它的源代码。


不能在 Windows 上同时运行 Docker 和 Razer Synapse 驱动管理工具,因为他们存在 StackOverflow 式的 bug


大约 2 年前,在 Windows 上运行 Docker 时有个奇怪的现象,即用户无法在 Windows 系统的机器上启动 Docker。这个奇怪的现象后来被人以问题的方式在 Github 提了出来。随后有很多其他人也说遇到了相同的问题。直到 Reddit 上的这篇文章发布之前,都没人知道根本原因是什么。


该文章指出,当 Windows 后台启动了 Razer Synapse 时,此时再去启动 Docker 就会触发此问题。其原因是,在 Razer Synapse 运行的时候,Docker 会认为已经有一个 Docker 实例正在运行中,所以 Docker 不会再启动一个实例。


两个应用程序各自都只允许同时启动一个自己的实例,这个需求看上去是个再合理不过的需求了。但是现实却是,这个限制确实是该 bug 的根本原因。下面是引发问题的代码片段:


var name = string.Format("Global\{0}", (object) Assembly.GetExecutingAssembly().GetType().GUID);
复制代码


从上面的代码可以发现,问题就出在返回的 GUID 类型上。此处返回的 GUID 类型是 System.Reflection.RuntimeAssembly(系统层面的运行时程序集),而不是 Windows 中对应 Docker 程序集中定义的类型。


译者注:以上代码说明,在控制同一时间只允许运行一个实例,Docker 的处理方式是通过判断 GUID 是否存在,但获取在 GUID 时,用的是系统层面的而非自己独立程序集里面的。


更有趣的事情是:


如果只有一个应用程序使用了上面的错误代码,那么上述问题根本就不会出现。但现实是,很多应用程序都使用了该错误代码,结果不允许两个实例同时运行。


你认为上面两个应用程序包含的错误代码片段是从哪里来的呢?


我想你已经猜到了,没错,正是来自于 StackOverflow。


在.net2.0中应用如何通过程序拿到GUID,这篇不正确的 StackOverflow 文章,就是这些应用程序错误代码的来源。


你现在去看问题的答案,已经看不到有缺陷的回答了。他们已经重新编辑了答案。如果你想自己手动去查找,可以通过Wayback Machine来查看历史文章,查询结果如下图:



截图由Кекек Мачан提供


对开发人员的重要启示:


  • 考虑一下如何在自己的程序中找到这个 bug

  • 你所拷贝的代码表面上似乎能正确的运行,但其实你没有意识到的是,此代码本身就是缺陷代码——因为你的程序中没有引发错误的场景


所以,我们该避免拷贝吗?


并非如此,直到今天,Stack Overflow 对于任何程序员来说,都是必不可少的。但在项目中因拷贝代码引起的大多数问题都是基本的安全问题。因此如果你能事先弄懂你所拷贝的代码,那么是可以正确使用的。即使如此,当准备在生产环境中使用这些代码时,也最好先做好充分的测试,特别是一些边缘场景,下面引用 Ryan Donovan 的一句话:


“如果你引用别人的代码,但你却不理解所引用代码的内容;那么您就会陷入重用具有潜在漏洞的代码的陷阱,同时这些包含漏洞的代码也就被你传播开了。”如果您要重用代码,那么请您先理解这些代码。


祝您编程愉快!


原文链接:


Why Code Snippets From Stack Overflow Can Break Your Project


2020-11-27 17:001793

评论

发布
暂无评论
发现更多内容

软件测试/测试开发丨Python 内置库 json、正则表达式 re

测试人

Python json 程序员 软件测试

如何通过数智平台多维数据库实现价值替代?

用友BIP

数据库 数智平台

分享三个java低代码开发平台,每个都很能打,建议收藏

优秀

低代码 低代码开发平台 java低代码开发平台

Blender 十大重点功能带你一次了解!

Finovy Cloud

blender

热烈祝贺埃文科技北京、上海、深圳分公司成立

郑州埃文科技

分公司成立

中企出海台湾篇之人力需求

用友BIP

全球化 中企出海

软件测试|MySQL安装最全教程

霍格沃兹测试开发学社

接口测试|HttpRunner简介及安装

霍格沃兹测试开发学社

HttpRunner

用友BIP全球司库十问之银行账户统一管理怎么做?

用友BIP

全球司库

人力场景全覆盖——中企出海之宝岛台湾

用友BIP

全球化 中企出海

【有奖体验】叮!你有一张 3D 卡通头像请查收

阿里巴巴云原生

阿里云 Serverless 云原生

接口测试|HttpRunner模拟发送GET请求&自动生成测试报告

霍格沃兹测试开发学社

HttpRunner

阿里云携手开放原子开源基金会倡议发起云原生工作委员会,两大开源项目达成捐赠意向

阿里巴巴云原生

阿里云 开源 云原生

推送服务接入指导(HarmonyOS篇)

HarmonyOS SDK

HMS Core

全面解析数据治理

郑州埃文科技

数据治理

华为新员工在学的课程长啥样? 扫码立即揭晓!

华为云PaaS服务小智

华为 培训 华为云

迈向先进治理与运营范式|2023开放原子全球开源峰会开源社区治理与运营分论坛圆满收官

开放原子开源基金会

开源 开放原子全球开源峰会 开放原子 开源社区治理与运营

单元测试|Unittest setup前置初始化和teardown后置操作

霍格沃兹测试开发学社

inBuilder今日分享丨Object-C消息转发与发送机制

inBuilder低代码平台

数智平台多维数据库:新时代的数据管理利器

用友BIP

数据库 数智平台

奇妙敏捷之旅·青岛站,真的太酷啦!

禅道项目管理

数据分析提效5倍,国有集团企业数字化历程 | 数字化标杆

袋鼠云数栈

数字化转型 数据治理 企业号 6 月 PK 榜

新手必看:Postman Newman 详细使用指南

Liam

程序员 测试 开发 Postman API

【有奖调研】HarmonyOS新物种,鸿蒙流量新阵地——元服务邀你来答题!

HarmonyOS SDK

HMS Core

Nautilus Chain测试网迎阶段性里程碑,模块化区块链拉开新序幕

鳄鱼视界

只需 2 小时,变身 Flink 实战派:Flink-Learning实战营火热报名中

Apache Flink

大数据 flink 实时计算

软件测试|f-string格式化输出的这些用法,90%的Pythoner不知道

霍格沃兹测试开发学社

Video-LLaMA 开源,大语言模型也能读懂视频了!

Zilliz

计算机视觉 AIGC Towhee LLM

软件测试/测试开发丨Python 控制流:循环、判断

测试人

Python 程序员 控制流 循环 判断

数智化时代,如何利用数智人力高效管理人才?

用友BIP

数智人力

为什么StackOverflow上的代码片段会摧毁你的项目_语言 & 开发_Mahdhi Rezvi_InfoQ精选文章