Pyramid.security问题:双饼干?不安全的饼干?过期?

zak*_*ces 8 python security cookies pylons pyramid

我正在第一次涉足金字塔安全模块.我正在使用此登录代码来设置auth_tkt:

@view_config(route_name='LoginForm', request_method='POST', renderer='string')
class LoginForm(SimpleObject):
    def __call__(self):

        emailAddress = self.request.params.get('emailAddress')
        password = self.request.params.get('password')

        if emailAddress != 'testemail@gmail.com' or password != 'testpassword':
            errorDictionary = { 'message' : "Either the email address or password is wrong." }
            self.request.response.status = 400
            return json.dumps( errorDictionary, default=json_util.default)

        testUserGUID = '123123123'

        headers = remember(self.request, testUserGUID)
        return HTTPOk(headers=headers)
Run Code Online (Sandbox Code Playgroud)

它似乎工作正常,但有一些令人费解的细节:

首先,实际上有两个cookie而不是一个.2个cookie是相同的(两者都是名称"auth_tkt"),除了一个区别:一个主机值为".www.mydomain.com",而另一个cookie主机值为"www.mydomain.com"为什么设置2个cookie而不是一个?主机价值差异有什么意义?

问题2,网络工具报告说两个cookie都不安全.我该怎么做才能确保cookie/s安全?

问题3:两个cookie的到期值均为"会话结束时".这是什么意思,我如何自己定制到期值?登录cookie到期时间的推荐做法是什么?

问题4:我不明白为什么"记住"的第一个论点是self.request而不是self.request.response.不应该在响应对象上记住数据,而不是请求对象吗?

Mar*_*ers 11

  1. 实际上,生成了3个cookie; 一个没有Domain密钥,一个没有密钥,第三个没有你的域的通配符版本(领先的点).您的浏览器通常要么合并两者,要么忽略其中一个(哪个是浏览器不同,这就是设置2的原因).

    wild_domain选项设置在AuthTktAuthenticationPolicy(默认为True)时生成最后一个cookie ; 看到AuthTktAuthenticationPolicyAPI.如果您的身份验证cookie要在不同的子域之间共享,则需要这样做(想想app1.domain,app2.domain); 如果没有通配符cookie,您的浏览器将不会跨子域共享cookie.

  2. 您需要secure在您的身份验证策略中为cookie 设置选项以获取安全标志集.再次,请参阅API.

  3. 没有设置过期,这意味着当您关闭浏览器时会删除cookie(浏览器显示的会话结束).如果您希望用户在关闭浏览器时注销,请将其保留为默认值.

    当您希望会话跨浏览器闭包时,设置cookie最大年龄,请参阅API中max_age选项.此选项将导致浏览器将cookie存储在磁盘上以在浏览器闭包之间保留,并在最大年龄过去时删除它们.

    请注意,AuthTktAuthenticationPolicy策略对象可以通过限制认为任何身份验证cookie有效的时间来以更细粒度的方式管理登录会话,并允许您设置cookie刷新策略.有了这样的刷新策略,用户将在继续使用您的应用程序时收到新的(刷新的)cookie,但如果他们在一段时间内没有连接到您的服务器,他们的cookie将被视为无效,他们将拥有再次登录

    有关如何配置它的更多详细信息,请参阅API文档中timeoutreissue_time选项.

  4. 策略对象需要来自请求的多条信息才能生成cookie,尤其是服务器的所有主机名.