SECRET_KEY的重要性

本文介绍了Django框架中SECRET_KEY的作用及其安全性问题,包括如何通过SECRET_KEY进行加密和签名,以及不当使用session机制可能导致的安全风险。

SECRET_KEY作用

本质上是一个加密盐
SECTET_KEY 在 django在加密,安全方面都有很突出的用处

json object的签名

加密函数中必不可少的,密码重置,表单提交,csrf的key,session数据等等都是需要SELECT_KEY的

这里面就要重点讲到session的问题,在这里使用不当就会导致攻击代码执行

settings的session设置

django默认存储session到数据库中,但是可能会比较慢,就会使用到缓存,文件,还有cookie等方式

如果采用了cookie机制,settings配置如下:

SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'

版本问题:django 1.6以下

在django1.6以下,session默认是采用pickle执行序列号操作

在1.6及以上版本默认采用json序列化。代码执行只存在于使用pickle序列号的操作中。

session处理流程

可以简单的分为两部分
process_request负责选择session引擎

process_response初始化cookie数据

代码

class SessionMiddleware(object):
    def process_request(self, request):
        engine = import_module(settings.SESSION_ENGINE)
        session_key = request.COOKIES.get(settings.SESSION_COOKIE_NAME, None)
        request.session = engine.SessionStore(session_key)

process_response 是用来处理 返回给用户的信息,这包括有关cookie的一些信息,比如修改过期时间等等。

在将session存入缓存后,可能在某个操作中会用到session信息,这个时候就会通过反序列化操作从缓存中取SECRET__KEY

如果反序列化引擎是采用pickle机制的话就有可能存在攻击代码执行。

反序列化的代码位于django.core.signing.py中,这个模块主要是一些签名,加解密操作,同时也包含序列化和反序列化,默认采用JSON引擎

反序列化loads的代码:

def loads(s, key=None, salt='django.core.signing', serializer=JSONSerializer, max_age=None):
    """
    Reverse of dumps(), raises BadSignature if signature fails
    """
    base64d = smart_str(
        TimestampSigner(key, salt=salt).unsign(s, max_age=max_age))
    decompress = False
    if base64d[0] == '.':
        # It's compressed; uncompress it first
        base64d = base64d[1:]
        decompress = True
    data = b64_decode(base64d)
    if decompress:
        data = zlib.decompress(data)
    return serializer().loads(data)
其攻击方式为:
首先泄露了SECRET_KEY
其次session引擎采用了signed_cookies
之后就是根据SECRET_KEY反序列化得到所想要得到的。。。

注:

django版本小于1.6即存在攻击代码执行问题。
同样的问题也存在于python的其他web框架中,如flask,bottle。

### 设置和使用 Superset 的 `SECRET_KEY` 在 Apache Superset 中,`SECRET_KEY` 是一个非常重要的安全参数,用于保护会话和其他敏感数据。为了确保系统的安全性,强烈建议自定义并妥善保管此密钥。 #### 创建随机生成的 `SECRET_KEY` 可以利用 Linux 命令行工具来生成高强度的随机字符串作为新的 `SECRET_KEY`: ```bash openssl rand -base64 42 ``` 该命令将会输出一串长度为42字符的Base64编码字符串,适合作为加密密钥[^3]。 #### 修改配置文件 找到 Superset 应用程序对应的库路径下的 `superset_config.py` 文件位置,并编辑之。如果不存在,则需手动创建。在此文件内添加如下代码片段以设定新产生的秘密键值对: ```python # superset_config.py import os SECRET_KEY = os.getenv('SUPERSET_SECRET_KEY', 'YOUR_OWN_RANDOM_GENERATED_SECRET_KEY') ``` 这里推荐通过环境变量的方式传递实际使用的密钥内容给应用程序实例化过程中的读取操作;而 `'YOUR_OWN_RANDOM_GENERATED_SECRET_KEY'` 则应替换为你之前通过 OpenSSL 工具获得的具体数值。 对于采用 Docker 部署方案的情况,还需要额外执行一些步骤以便让容器内部能够识别到外部修改过的配置项。具体做法是先停止正在运行的服务进程,接着把主机上的最新版配置文档复制进去覆盖旧版本,最后重新启动服务使更改生效[^4]: ```shell docker stop my_superset docker cp ./config.py my_superset:/app/superset/ docker start my_superset ``` 完成上述调整之后,再次尝试初始化数据库应该不会再遇到有关默认密钥检测失败的问题提示了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值