【问题标题】:Is it bad practice to expose back end on github?在 github 上公开后端是不好的做法吗?
【发布时间】:2020-09-08 16:15:30
【问题描述】:

这可能是一个愚蠢的问题,但我绝对是后端代码的初学者,并且我正在尝试专业地练习构建应用程序。将我的应用程序的整个代码库(不包括数据库密码、api 密钥和其他敏感数据位)推送到公共 github 存储库是否被认为是不好的做法?这是否会将我的应用程序(一旦托管)置于易受攻击的位置?如果将 github 存储库设置为私有,是否安全?在github上处理前端和后端的专业方式是什么?我已经在网上搜索过,但“后端”和“github”只是显示“github 页面不支持服务器端代码”的结果。这很有趣,但完全不同。

【问题讨论】:

  • “什么是在github上处理前端和后端的专业方式” - 术语称为“秘密管理”。
  • en.wikipedia.org/wiki/Kerckhoffs%27s_principle 您应该尝试以一种安全的方式构建您的应用程序,即使攻击者可以访问完整的源代码。否则,您将通过默默无闻来依赖安全性。
  • @Dai OP 明确写道“排除数据库密码 [...]”。您的报价在很大程度上歪曲了所写的内容。
  • @Polygnome 哦,哇,适合我的速读。我已经删除了我最初的评论回复。

标签: php github backend


【解决方案1】:

假设您的应用程序遵循最佳实践并且没有漏洞,这是绝对安全的,只要您不(意外)包含您提到的任何凭据或机密。

如果您的应用程序确实存在漏洞,将其放在 GitHub 上实际上可能会降低危险。如果该漏洞存在于您正在使用的依赖项中,请向该漏洞GitHub might alert you,让您意识到它并允许您修复它。此外,其他用户可能会发现漏洞、报告问题或 PR 并帮助您修复它。另一个额外的好处是,如果您自己的计算机受到威胁,您的代码可以安全地存储在异地。

另一方面,有动机的攻击者可能想要利用该漏洞。为了做到这一点,他们仍然需要筛选您的代码以找到它,然后攻击您是使用您的软件的人。除非您的软件被高价值目标或大量目标使用,否则这对攻击者来说是不经济的。

如果将 github repo 设置为私有是否安全?

差不多。私人回购的内容在section E of the ToS进行规范:

短版:您可以访问私有存储库。我们将私有存储库的内容视为机密,并且仅出于支持原因、征得您的同意或出于安全原因需要访问它。

我鼓励您阅读 ToS 的整个部分,如果您担心私人回购的机密性,这不是很长,但值得一读。

请注意,现在微软自己在 GitHub 上的私人存储库中托管 Windows 源代码。许多其他公司也这样做。 GitHub 在这方面赢得了值得信赖的声誉。

恕我直言,我会毫不犹豫地在 GitHub 上公开发布开源项目。但是,如果该项目是一个封闭源代码的盈利应用程序,那么问题就出现了,为什么您首先要提供源代码。私人回购会更适合。

【讨论】:

  • "Microsoft .... GitHub 上的 Windows 源代码,位于私有存储库中。"微软公开谈论过这个吗?该声明有参考吗? (不要从 GitHub 作为一个平台的可信度中拿走任何东西。)
  • @Brad 是的,他们在 GitHub 被 MS 收购的时候谈到了这个问题(我认为想要放置自己的代码也是收购它们的一个因素)。就在本月初,少数 MS 的私有 GitHub 存储库被非法访问,MS 很快指出 Office 和 Windows 都不在这些存储库中。但是自从 MS 收购 GitHub 已经有一段时间了,我还没有保留任何书签。他们可能使用自己的 Windows GitHub Enterprise 实例。 MS 至少从 2017 年初就开始使用 Git。
  • 你提到的 GVFS 文章只说 Windows 正在使用 Git,我知道这一点。我的问题是关于 Windows 专门在 GitHub 中,我不相信这篇文章这么说。他们可能使用 GitHub 以外的服务器作为其 GVFS Windows 存储库,我没有阅读任何将其标识为 Github 的文章,尽管我知道微软也在 GitHub 上托管了大量代码。
【解决方案2】:

假设您使用的是 php,但这也适用于其他语言。

在构建时,我将所有 db/connect 凭据放在一个文件中,并将每个凭据设置为一个变量,例如 $username、$password 等。然后使用包含语句将这些变量带入连接文件。然后,如果您担心其他人看到它,请将该凭证文件放入您的 .gitignore 中。

确保包含语句在连接语句之前。

例如

//credential.php
$username = 'usernameExample'
$password = 'passwordExample'

//then in your connect file

//connect.php
include 'credential.php'

//put a try block here
   $conn = new PDO("mysql:host=$servername;dbname=myDB", $username, $password);
 /put a catch block here

对于 gitignore,只需将 make 文件命名为 .gitignore 并将 credential.php 放入

【讨论】:

  • 这就是我所做的。我的目录根目录中有一个名为 config.php 的文件,它以数组的形式返回敏感凭据。然后我使用 .gitignore 来避免跟踪文件。但是,其他所有代码都可以安全地供公众查看吗?
  • “安全”是一个加载的术语。除非您有理由不这样做,否则我会将您的回购保密。其他人指出攻击者如何评估您的代码以找到漏洞(然后可能利用它)。或者想象一个竞争对手克隆了你的 repo 并避免了编写自己的应用程序的痛苦:这可能是也可能不是问题,具体取决于你的商业模式。
【解决方案3】:

我不认为有一个简短的答案。

很大程度上取决于代码质量本身。如果您不使用准备好的语句来访问数据库,那么可能想要攻击您的后端站点的人可能会找到一种简单的方法。如果您正确使用准备好的语句,他们甚至可能不会为 sql 注入攻击而烦恼。

但企业将代码保密的主要原因是它被视为敏感数据,就像密码和 API 密钥一样。如果您的代码位于公共存储库中,竞争对手可以简单地复制您的代码,然后可能会稍微修改一下布局,并在一周内运行您需要一年时间来构建、改进和扩展的东西。

尽管如此,即使您将代码保密,您仍应将其视为公开的。这意味着您需要确保密码和 api 密钥之类的内容不会最终出现在存储库中。

另外请记住,提交后很难从 git 存储库中删除文件。如果一个文件在提交 123456 中提交,然后在提交 abcdef 中删除,它仍然存在于提交历史记录中。

【讨论】:

    猜你喜欢
    • 2019-10-27
    • 2020-11-28
    • 2012-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-27
    • 1970-01-01
    • 2020-09-07
    相关资源
    最近更新 更多