将我的代码发布到 Github 会影响我的应用程序安全吗?

4

背景

我正在使用 Django(通过模板语言传递数据)编写一个简单的博客应用程序。博客所有者将可以访问管理员页面,并更新数据库。现在我明白,在生产环境中,我必须隐藏安全密钥并关闭调试。

问题

我想知道,将代码推送到 Github 是否会危及应用程序的安全性?

5个回答

7
是的,你可以这样做,但请确保不要将你的密钥和密码存储在主要的settings.py文件中。由于你正在使用Django,Python自带一个名为python-decouple的软件包,它可以帮助你将秘密文件保留在.env文件中。
你可以通过在Django项目中使用以下命令来安装它:
 pip install python-decouple
现在,让我们考虑你有以下的settings.py文件:
import os

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
SECRET_KEY = '3izb^ryglj(bvrjb2_y1fZvcnbky#358_l6-nn#i8fkug4mmz!'
DEBUG = True
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'HELLO_DJANGO',
        'USER': 'U_HELLO',
        'PASSWORD': 'hA8(scA@!fg3*sc&xaGh&6%-l<._&xCf',
        'HOST': '127.0.0.1',
        'PORT': '',
    }
}

因此,您需要在django项目的根目录中创建一个.env文件,如下所示:

SECRET_KEY=3izb^ryglj(bvrjb2_y1fZvcnbky#358_l6-nn#i8fkug4mmz!
DEBUG=True
DB_NAME=HELLO_DJANGO
DB_USER=U_HELLO
DB_PASSWORD=hA8(scA@!fg3*sc&xaGh&6%-l<._&xCf
DB_HOST=127.0.0.1

如果您想将项目上传到Github,请确保在.gitignore文件中包含.env文件。 现在是最后一步:

import os
from decouple import config

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
SECRET_KEY = config('SECRET_KEY')
DEBUG = config('DEBUG', cast=bool)
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': config('DB_NAME'),
        'USER': config('DB_USER'),
        'PASSWORD': config('DB_PASSWORD'),
        'HOST': config('DB_HOST'),
        'PORT': '',
    }
}

以这种方式,您可以在不让任何人知道的情况下使用您的秘密密钥。

密钥中的特殊字符,如#=可能会导致意外行为。因此最好总是将其用引号括起来,例如:SECRET_KEY="3izb^ryglj(bvrjb2_y1fZvcnbky#358_l6-nn#i8fkug4mmz!" - Jaladh Singhal

5
这个问题有两个方面。代码和密钥是两个不同的问题。
发布代码是否会影响应用程序的安全性?
尽管公开发布代码可能会引起读者的注意,他们可能会指出安全问题,但它也会将这些问题暴露给潜在的恶意个人。隐藏代码并不能使其更安全,但至少安全问题不会那么明显易见。这部分问题已经被辩论过了,可能被认为是基于观点或重复的。
请参见链接到另一个答案中的 Gabor's answser this SE post
如何发布代码而不暴露敏感信息?
不要将秘密内容(密码、密钥等)放在代码中。这些应该放在一个不在存储库中的配置文件中。即使存储库是私有的,在这里保存这些内容也有点不太好。
将您的代码视为应用程序。使用您的代码的网站是此应用程序的实例,具有特定的设置。您可以有多个网站共享相同的代码,但具有不同的设置(这使维护更容易,顺便说一句)。
Flask配置模式示例
以下是我在Flask中所做的。我认为Django可以使用类似的模式,尽管它可能提供了不同的帮助程序(例如{{link1:Vinit's answer}}中的django-decouple)。
在存储库中放置一个default_settings.py文件,并在实例化应用程序时覆盖一些重要设置。这是一种在http://flask.pocoo.org/docs/0.12/config/#configuring-from-files中描述的模式。

default_settings.py

class Config():
    DEBUG = False
    TESTING = False
    [...]

class ProductionConfig(Config):
    [...]


class DevelopmentConfig(Config):
    SECRET_KEY = 'dummy_key'
    DEBUG = True
    [...]

class TestingConfig(Config):
    SECRET_KEY = 'dummy_key'
    TESTING = True
    [...]

请注意,我在生产模式下没有设置默认的密钥,这样如果我忘记在应用程序配置文件中覆盖它,应用程序将不会使用虚假密钥运行。

application.wsgi

#!/usr/bin/env python3
"""Sample wsgi file

Customize path to virtual environment and you're done
"""

import os
import sys
import runpy

# Working with Virtual Environment
# see http://flask.pocoo.org/docs/0.10/deploying/mod_wsgi/
# and also https://gist.github.com/LeZuse/4032238
# and https://dev59.com/YHRC5IYBdhLWcg3wAcbU
runpy.run_path('/path/to/venv/bin/activate_this.py')

# Add application to Python path
# Check before adding so as not to add it multiple times
# when reloading the file:
# https://code.google.com/p/modwsgi/wiki/ReloadingSourceCode
PATH = os.path.dirname(__file__)
if PATH not in sys.path:
    sys.path.append(PATH)

# Set environment variable to indicate production mode
os.environ['FLASK_CONFIG'] = 'ProductionConfig'

# Provide path to custom settings file
os.environ['SETTINGS_FILE'] = os.path.join(
    os.path.dirname(os.path.realpath(__file__)),
    'settings.cfg'
)

[...]

settings.cfg

# Flask secret key
# To generate a secret key:
# ''.join([random.choice(string.printable) for i in range(100)])
SECRET_KEY = 

# Other secret keys
[...]

然后在应用程序中。
config_class = os.getenv('FLASK_CONFIG')
app.config.from_object(config_class)
app.config.from_envvar('SETTINGS_FILE', silent=True)

(多)实例化简化

使用setuptools,我可以轻松地在virtualenv中部署应用程序。创建应用程序的实例只需要以下步骤:

  • 创建虚拟环境
  • pip install my_app
  • 复制并调整.wsgi示例文件
  • 复制并调整本地settings.cfg示例文件
  • 在Web服务器中配置和激活网站(/etc/apache2/sites-available/my_app.conf

服务器上的网站目录仅包含特定于此实例的虚拟环境和两个配置文件。

在存储库中存储示例文件(.wsgisettings.cfg,apache .conf文件等)是可以的,放置在docs/目录中,并带有参数占位符。


2
我认为重要的是这不会影响你的应用程序的安全。也就是说,无论你是否在GitHub上发布,技术漏洞都是一样的(前提是你不分享秘密,但请注意,秘密只应该是加密的,像算法或某些操作方式或集成方式等内容不应该是机密的,请参见避免依赖安全性)。
然而,在GitHub上分享你的代码会影响你的风险,而总体来说,很难说哪种方式更好,这是相当主观的。你肯定会有一个不同的风险概况。与封闭源代码相比,开源代码修改了你威胁模型中某些事物发生的可能性(某些事情变得不太可能,但有些事情变得更有可能),你应该认识到并管理这些变化。

2
避免将代码发布到Github并不会使网站更安全。我认为恰恰相反。为什么?因为如果一个优秀的黑客真的想找到漏洞,他就能找到。但是如果你将你的代码发布到Github上,你很可能会遇到白帽子,他们会告诉你是否发现了安全问题(但是,你仍然不应该让明显的安全问题存在)。
在我看来,不将代码发布到Github几乎可以保证你的代码不会被盗用。但是,如果你放置正确的许可证,你也可以起诉窃取你代码的人。
PS:我还不是最有经验的开发者,所以你可能需要考虑其他意见。
编辑:这里有一些阅读材料:https://softwareengineering.stackexchange.com/questions/177030/security-issue-about-making-my-code-public-in-github

1
如果我不想让任何人看到我的代码,并且只想给予某些人访问权限,我会将我的存储库设为私有。对我来说,这个名义费用是值得的。但总体而言,我的项目源代码一直是公开的,就像Alex所说的那样,这是从他人那里获得意见的好机会。

如果你正在与少于5人的团队合作,Bitbucket上有无限免费的私有仓库。 - Alex
@AlexvanVliet 我不知道那个。谢谢你提供的信息。 - Corey Gumbs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接