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

use*_*992 4 security django github

背景

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

我在徘徊的是将代码推送到github是否会危及应用程序的安全性?

Jér*_*ôme 5

这个问题是双重的。代码和密钥是两个不同的问题。

发布代码是否会影响应用程序的安全性?

虽然公开发布代码可能会引起可能指出安全问题的读者的注意,但它也会将这些问题暴露给潜在的恶意个人。隐藏代码不会让它更安全,但至少安全问题不会那么明显。这部分问题已经过辩论,可以视为基于意见或重复。

请参阅Gabor 的答案或在另一个答案中链接到的此 SE 帖子

如何在不暴露敏感信息的情况下发布代码?

不要在代码中放置秘密内容(密码、密钥等)。这些应该在不在存储库中的配置文件中。即使存储库是私有的,将它们保留在这里也会有点脏。

将您的代码视为一个应用程序。使用您的代码的网站是此应用程序的一个实例,具有特定设置。您可以让多个网站共享具有不同设置的相同代码(这使维护更容易,顺便说一句)。

Flask 配置模式示例

这就是我用 Flask 做的事情。我想类似的模式可以与 Django 一起使用,尽管它可能会提供帮助程序来做不同的事情(就像django-decoupleVinit 的回答中一样)。

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
    [...]
Run Code Online (Sandbox Code Playgroud)

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

应用程序.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 /sf/ask/30533891/
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'
)

[...]
Run Code Online (Sandbox Code Playgroud)

设置.cfg

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

# Other secret keys
[...]
Run Code Online (Sandbox Code Playgroud)

然后在申请中

config_class = os.getenv('FLASK_CONFIG')
app.config.from_object(config_class)
app.config.from_envvar('SETTINGS_FILE', silent=True)
Run Code Online (Sandbox Code Playgroud)

 (多)实例化简化

使用setuptools,我可以轻松地将应用程序部署到virtualenv. 创建应用程序的实例只需执行以下步骤:

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

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

可以将 repo 中的示例文件存储在docs/目录(.wsgi, settings.cfg, apache.conf文件,...)中,并带有参数占位符。


Vin*_*Raj 5

是的,您可以,但请确保不要将您的密钥和密码保存在主文件中。settings.py由于您使用的是 django,python 附带了一个名为的包pytho-decouple,可帮助您将您的秘密文件保存在 .env 文件中。

您可以在 django 项目中使用以下命令安装它:

 pip 安装 python 解耦

现在让我们考虑您有以下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': '',
    }
}
Run Code Online (Sandbox Code Playgroud)

所以你需要做的是在你的 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
Run Code Online (Sandbox Code Playgroud)

由于您想在 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': '',
    }
}
Run Code Online (Sandbox Code Playgroud)

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