github 存储库上 Flask 应用程序的 .wsgi 密钥的标准实践

Standard practice for .wsgi secret key for flask applications on github repositories

我正在构建一个 Flask Web 应用程序,并希望将其放在 github 存储库中。

我注意到在 .wsgi 文件中

#!/usr/bin/python
import sys
import logging
logging.basicConfig(stream=sys.stderr)
sys.path.insert(0,"/var/www/hashchain/")

from hashchain import app as application
application.secret_key = 'super secret key'

有一个application.secret_key用于加密...

我猜测将 Flask Web 应用程序放在 github 上的标准方法包括克隆整个 Flask 应用程序文件夹而不是 .wsgi 文件?

这样,贡献者可以在自己的本地主机上以调试模式自由 运行 flask 以进一步开发它,如果他们真的想要可以将它部署到他们自己的服务器(但必须编写自己的 .wsgi他们控制的服务器的文件和配置)。

这是正确的思考方式吗?我猜想如果我将 .wsgi 文件放在 github 上,它会成为黑客的开放季节吗?

如评论所述,秘密或任何其他敏感信息永远不应成为 Git 存储库的一部分。

为了说明这一点,请参阅 ubuntudesign/git-mirror-service,一个简单的 WSGI 服务器,用于在另一个远程上创建远程 git 存储库的镜像。
它确实包括以下步骤:

Optional secret

By default the server is unsecured - anyone who can access it can use it to mirror to repositories that the server has access to.

To prevent this, you can add a secret:

echo "79a36d50-09be-4bf4-b339-cf005241e475" > .secret

Once this file is in place, the service will only allow requests if the secret is provided.

NB: For this to be an effective security measure, the server should be only accessible over HTTPS.

文件是ignored in .gitignore
如果存在,wsgi.py 读取它:

secret_filename = os.path.join(script_dir, ".secret")
if os.path.isfile(secret_filename):
    with open(secret_filename) as secret_file:
        real_secret = secret_file.read().strip()

执行此操作的一般方法是从环境变量中读取:

import os

application.secret_key = os.getenv('SECRET_KEY', 'for dev') 

请注意,它还为开发设置了默认值。

您可以手动设置环境变量SECRET_KEY

$ export SECRET_KEY=you_key_here  # use $ set ... in Windows

或者您可以将其保存在项目根目录下的 .env 文件中:

SECRET_KEY=you_key_here

加入.gitignore:

.env

然后你可以使用python-dotenv或类似的东西来导入变量:

# pip install python-dotenv
import os
from dotenv import load_dotenv

load_dotenv()

application.secret_key = os.getenv('SECRET_KEY', 'for dev')