python - 如何为 Google App Engine 实现简单 session ?

标签 python security google-app-engine session cookies

这是一个非常基本的类,用于处理 App Engine 上的 session :

"""Lightweight implementation of cookie-based sessions for Google App Engine.

Classes:
Session

"""

import os
import random
import Cookie
from google.appengine.api import memcache

_COOKIE_NAME = 'app-sid'
_COOKIE_PATH = '/'
_SESSION_EXPIRE_TIME = 180 * 60


class Session(object):

    """Cookie-based session implementation using Memcached."""

    def __init__(self):
        self.sid = None
        self.key = None
        self.session = None
        cookie_str = os.environ.get('HTTP_COOKIE', '')
        self.cookie = Cookie.SimpleCookie()
        self.cookie.load(cookie_str)
        if self.cookie.get(_COOKIE_NAME):
            self.sid = self.cookie[_COOKIE_NAME].value
            self.key = 'session-' + self.sid
            self.session = memcache.get(self.key)
        if self.session:
            self._update_memcache()
        else:
            self.sid = str(random.random())[5:] + str(random.random())[5:]
            self.key = 'session-' + self.sid
            self.session = dict()
            memcache.add(self.key, self.session, _SESSION_EXPIRE_TIME)
            self.cookie[_COOKIE_NAME] = self.sid
            self.cookie[_COOKIE_NAME]['path'] = _COOKIE_PATH
            print self.cookie

    def __len__(self):
        return len(self.session)

    def __getitem__(self, key):
        if key in self.session:
            return self.session[key]
        raise KeyError(str(key))

    def __setitem__(self, key, value):
        self.session[key] = value
        self._update_memcache()

    def __delitem__(self, key):
        if key in self.session:
            del self.session[key]
            self._update_memcache()
            return None
        raise KeyError(str(key))

    def __contains__(self, item):
        try:
            i = self.__getitem__(item)
        except KeyError:
            return False
        return True

    def _update_memcache(self):
        memcache.replace(self.key, self.session, _SESSION_EXPIRE_TIME)

我想要一些关于如何改进代码以提高安全性的建议。

注意:在生产版本中,它还会在数据存储区中保存 session 的副本。

注意':虽然我想了解更多有关此主题的信息,但我知道网上有更完整的实现,所以请不要用“使用那个”或“使用那个”来回答问题其他”库。

最佳答案

这里有一个简化实现的建议。

您正在创建一个随机化的临时 key ,用作内存缓存中的 session key 。您注意到您还将 session 存储在数据存储中(它将有另一个 key )。

为什么不随机化 session 的数据存储 key ,然后将其用作数据库和内存缓存(如果需要)的唯一 key ?这种简化会带来任何新的安全问题吗?

下面是一些用于为 session 模型创建随机数据存储 key 的代码:

# Get a random integer to use as the session's datastore ID.
# (So it can be stored in a cookie without being 'guessable'.)
random.seed();
id = None;
while None==id or Session.get_by_id( id ):
    id = random.randrange( sys.maxint );
seshKey = db.Key.from_path( 'Session', id );    
session = Session( key = seshKey );

要从 session 中获取 ID(即存储在 cookie 中),请使用:

sid = session.key().id();

从 cookie 中读取“sid”后检索 session 实例:

session = Session.get_by_id( sid );

关于python - 如何为 Google App Engine 实现简单 session ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2560022/

相关文章:

python - 如何在 PyGame Snake 游戏中添加分数跟踪器?

c# - 自动更新 : Is this secure?

用于 GAE 设置的 Django 基本 WSGI 处理程序

google-app-engine - 如何使用 Google App Engine 任务队列按 (FIFO) 顺序执行任务?

python - 将Python字典组合成一个字符串csv

python - 正则表达式不获取转义引号

python - 我如何处理部分初始化的类

android - 在(webOS、BADA 和 Iphone)与 Android 之间做出选择时感到困惑

azure - 将应用程序注册访问权限限制为特定组

java - GAE - 谷歌云存储 - 上传(acl : read-public and get the public shared url)