背景
我正在Django中编写一个简单的博客应用程序(数据通过模板语言传递)。博客的所有者将可以访问管理页面,他们将更新数据库。现在我明白在生产中我将隐藏安全密钥并关闭调试。
问题
我在徘徊是否会将代码推送到github危及应用程序的安全性?
答案 0 :(得分:4)
这个问题是双重的。代码和密钥是两个不同的问题。
虽然公开发布代码可能会引起可能指出安全问题的读者的注意,但它也会将这些问题暴露给潜在的恶意个人。隐藏代码不会使它更安全,但至少安全问题不会那么明显。这部分问题已经辩论过,可以视为基于意见或重复。
请参阅另一个答案中链接的Gabor's answser或this SE post。
不要在代码中放入秘密内容(密码,密钥等)。这些应该在不在存储库中的配置文件中。即使存储库是私有的,将它们保存在这里也会有点脏。
将您的代码视为一个应用程序。使用您的代码的网站是此应用程序的一个实例,具有特定设置。您可以让多个网站使用不同的设置共享相同的代码(这使得维护更容易,BTW)。
这是我对Flask的处理方式。我想类似的模式可以和Django一起使用,虽然它可以提供不同的帮助(例如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://stackoverflow.com/questions/436198/
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
示例文件/etc/apache2/sites-available/my_app.conf
)服务器上的网站目录仅包含虚拟环境和特定于此实例的两个配置文件。
可以将示例文件存储在docs/
目录(.wsgi
,settings.cfg
,apache .conf
文件,...)中的repo中,并使用占位符参数。
答案 1 :(得分:2)
避免向github发布代码并不能使网站更安全。我恰恰相反。为什么?因为如果一个好的黑客真的想找到一个漏洞,他会的。但是,如果你将代码发布到github,你很可能会遇到白帽子,他会告诉你他们是否发现安全问题(但是,你不应该让明显的安全问题)。
在我看来,不向github发布代码几乎可以保证您的代码不会被盗。但是,如果你选择了正确的许可证,你可以起诉那个窃取你的代码的人,我猜。
PS:我还不是最有经验的开发人员,所以你应该考虑其他意见。
答案 2 :(得分:2)
是的,您可以确保不要将密钥和密码保存在主settings.py
文件中。因为您使用的是django,python附带一个名为pytho-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': '',
}
}
通过这种方式,您可以在不让任何人知道的情况下使用您的密钥。
答案 3 :(得分:1)
如果我不想让任何人看到我的代码并允许我想要访问的任何人,我会将我的回购私有化。象征性的费用是值得的,至少对我而言。
但总的来说,我的项目源代码已经公开,就像亚历克斯所说,这是一个很好的机会从其他人那里获得意见。
答案 4 :(得分:1)
我认为重要的是它不会影响应用程序的安全性,即。技术漏洞将是相同的,无论它是否发布在GitHub上(假设您不共享秘密,但请注意秘密应该只是加密的,诸如算法之类的东西或者某些东西如何工作或集成不应该是秘密,请参阅{{ 3}})。
但是,在GitHub上共享您的代码确实会影响您的风险,而且很难说总体上采用哪种方式,这一点很明显。您肯定会有不同的风险状况。拥有开源代码(与封闭源代码相对)会修改威胁模型中某些事物的可能性(有些事情变得越来越不可能,但有些事情越来越可能),您应该承认和管理这些事情。