如何拷贝网站源码-从 StackOverflow 复制的代码片段,损坏了!

作者 | 马赫迪·雷兹维

规划| 蒂娜

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

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

现在,StackOverflow已经成为很多程序员的救星。 我们大多数人甚至没有访问过 StackOverflow 主页。 我们访问该网站的唯一方法是在 Microsoft 中搜索我们遇到的问题或错误,然后直接进入该问题的讨论。

虽然去 StackOverflow 寻找问题解决方案的习惯很有用,但同时我们可能会无意中使用一些包含严重错误或安全缺陷的代码。 众所周知,直接从 StackOverflow 复制代码是不合适的,但开发人员仍然会这样做。 以下是瑞恩·多诺万的一句话:

代码重复本身并不是坏事,代码复用可以提高软件开发效率。 为什么我们还要去解决一个已经完美解决的问题呢? 但是,当开发人员在不理解示例代码的情况下使用它时,就会出现问题。

您可能认为这些安全恐慌只是都市传说,但我可以向您保证事实并非如此。

最近遇到的几件事引起了我对这个问题的关注。 下面我就这几件事简单解释一下。

1 拷贝数最多的Java代码片段一直存在缺陷

我第一次知道这个信息是在一篇博客中看到的,而这篇博客的作者就是该类Java代码的提供者,点击这里查看博客原文。

该代码的作者 Andreas Lundblad 是 Palantir 的 Java 开发人员,也是 StackOverflow 的顶级贡献者之一,他在博客中承认了这些缺陷。

2018 年,Sebastian Baltes 在《Empirical Software Engineering》杂志上发表了一篇研究论文。 论文强调,Andreas 在 StackOverflow 上发布的一段 Java 代码是 StackOverflow 上被复制最多的 Java 代码,甚至多次在开源项目中使用。 GitHub 上至少有 6,000 个 Java 项目使用此代码片段。

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

在 Sebastian Baltes 告知其令人难以置信的分布后,Andreas 重新审查了代码。 然后在自己的个人博客中发布了修正后的版本,并且在博客的最后还给出了一些宝贵的建议:

尽管这个错误是一个微不足道的边缘情况,只会导致文件大小估计不准确,但实际情况可能更糟,让我们看更多的反例。

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

2019年,Morteza Verdi等人发表了一篇研究论文。 该论文强调,过去 10 年 StackOverflow 上最流行的 C++ 代码片段中有 69 个存在重大安全漏洞。 69 个已确认的易受攻击的代码片段被用于 2,589 个 GitHub 项目。 研究人员表示,从 StackOverflow 传播到 GitHub 的代码中最常见的安全漏洞是 CWE150:

CWE 是社区制定的常见软件和硬件安全缺陷列表。 它是一种通用语言,是评判安全工具的标准,是缺陷识别、避免和预防的基础。

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

该论文的研究人员还开发了一个 Chrome 扩展,在查看 StackOverflow 代码片段时,可以提醒开发人员当前正在阅读的代码中存在安全漏洞。 虽然这个扩展通常不是很有用,但如果你有兴趣,可以点击这里查看它的源代码。

3Windows无法同时运行Docker和Razer Synapse驱动管理工具

无法在 Windows 上同时运行 Docker 和 Razer Synapse 驱动程序管理工具,因为它们存在 StackOverflow 式的错误

大约 2 年前,在 Windows 上运行 Docker 时出现了一个奇怪的现象,即用户在基于 Windows 的机器上启动 Docker 遇到困难。 这个奇怪的现象后来在Github上作为问题提出来。 随后还有很多人也表示遇到了同样的问题。 在 Reddit 上发表这篇文章之前,没有人知道根本原因是什么。

文章强调,当Razer Synapse在Windows后台启动时,此时启动Docker会触发此问题。 原因是,当 Razer Synapse 运行时如何拷贝网站源码,Docker 会认为已经有一个 Docker 实例在运行,因此 Docker 不会启动另一个实例。

这两个应用程序中的每一个都只允许同时启动其自身的一个实例,这似乎是一个合理的要求。 但现实情况是,这个限制确实是 bug 的根本原因。 这是导致问题的代码片段:

var name = string.Format("Global{0}", (objectAssembly.GetExecutingAssembly().GetType().GUID);

从前面的代码可以看出,问题出在返回的GUID类型上。 这里返回的GUID类型是System.Reflection.RuntimeAssembly(系统级别的运行时程序集),而不是Windows上相应的Docker程序集中定义的类型。

译者注:上面的代码表明,同一时间只允许有一个实例运行。 Docker的处理方式是判断GUID是否存在,但是在获取GUID时,是使用系统级别的,而不是自己独立的程序集。

更有趣的是:

如果只有一个应用程序使用上述错误代码,则根本不会出现上述问题。 但实际情况是,许多应用程序都使用此错误代码,它不允许两个实例同时运行。

您认为这两个应用程序中包含的错误代码片段来自哪里?

我想你已经猜到了,是的,它来自 StackOverflow。

这篇关于如何在 .net2.0 中以编程方式获取 GUID 的错误 StackOverflow 文章是此应用程序错误代码的来源。

当您现在查看问题的答案时,您将不再看到有缺陷的答案。 他们已经重新编辑了答案。 如果您想自行自动搜索,可以通过时光机查看历史文章。 查询结果如下:

开发人员的重要收获:

4 我们应该防止抄袭吗?

事实并非如此,直到明天如何拷贝网站源码,Stack Overflow 对任何程序员来说都是必不可少的。 但项目中复制代码带来的问题大部分都是基本的安全问题。 所以如果你能理解你事先复制的代码,就可以正确使用。 即便如此,当计划在生产环境中使用此类代码时,最好先做好测试,尤其是一些边缘场景。 以下是瑞恩·多诺万的一句话:

“如果你引用了别人的代码,但你不明白引用代码的内容;那么你就陷入了重用潜在易受攻击的代码的陷阱,并且传播了有缺陷的代码。” 如果您想重用代码,请先了解这段代码。

原文链接

---END---

推荐阅读:
Android Studio启用新代号,新版本Arctic Fox(白狐)重点新特性一览!
工信部一号命令!微信支付宝等超级App需集体改造
GitHub「有偿刷Star」遭热议,请别赚开源的黑心钱
利用MotionLayout实现RecyclerView折叠展开动画!
鸿蒙OS开源项目的OpenHarmony
硬核!关于PDD员工发帖溯源联想到的相关技术与实现
虎牙二面:说说你对 Java “零拷贝”的理解?
全球最大色情网站宣布:封杀特朗普


更文不易,点个“在看”支持一下

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 网站源码 如何拷贝网站源码-从 StackOverflow 复制的代码片段,损坏了! https://www.wkzy.net/game/161417.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务