【问题标题】:Pyramid.security questions: Double cookies? Insecure cookies? Expiration?Pyramid.security 问题:双重 cookie?不安全的cookies?过期?
【发布时间】:2013-02-06 05:44:22
【问题描述】:

我将首次涉足 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)

似乎还可以,但有一些令人费解的细节:

首先,实际上设置了 2 个 cookie 而不是一个。这 2 个 cookie 是相同的(都具有名称“auth_tkt”),除了一个区别:一个的主机值为“.www.mydomain.com”,而另一个 cookie 的主机值为“www.mydomain.com” 为什么是设置 2 个 cookie 而不是 1 个?主机值不同有什么意义?

问题 2,网络工具报告说这两个 cookie 都不安全。我可以做些什么来确保 cookie/s 是安全的?

问题 3:两个 cookie 的过期值都是“在会话结束时”。这是什么意思,我如何自己自定义到期值?登录 cookie 过期时间的推荐做法是什么?

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

【问题讨论】:

  • 大概你的意思是serverUserGUID = '1123123123';你用那个变量名调用remember。
  • 谢谢...我修正了错误。

标签: python cookies security pylons pyramid


【解决方案1】:
  1. 实际上,生成了 3 个 cookie;一个没有Domain 键,一个有,第三个带有您的域的通配符版本(前导点)。您的浏览器通常要么合并两者,要么忽略其中之一(哪一个因浏览器而异,这就是设置 2 的原因)。

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

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

  3. 未设置过期时间,这意味着当您关闭浏览器(浏览器向您显示的会话结束)时,cookie 将被删除。如果您希望您的用户在关闭浏览器时退出登录,请将其保留为默认值。

    仅如果您希望会话在浏览器关闭期间持续存在,请设置 cookie 最长期限,请参阅API 中的max_age 选项。此选项将导致浏览器将 cookie 存储在磁盘上,以在浏览器关闭之间持续存在,并在最长期限过后将其删除。

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

    请参阅API documentation 中的timeout 和reissue_time 选项,了解有关如何配置的更多详细信息。

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

【讨论】:

  • 感谢您的澄清。我想知道的一件事是,AuthTKTAuthentication Policy 对 csrf 攻击是否安全?如果不是,我们怎样才能使它安全。还有一件事,我们如何将它用于连接到客户端移动应用程序的服务器。我猜饼干的事情会很困难。令牌选项不是更好吗??
  • 将http_only 设置为True 告诉浏览器对JavaScript 隐藏cookie;这使得窃取 cookie 的 CSRF 攻击无效。 Cookie 只是 HTTP 标头,您的移动客户端必须像管理任何其他站点一样管理它们。不知道令牌选项是什么意思。
  • 我不确定这是否会阻止 csrf 攻击,cookie 会自动附加到对它们设置的域的任何请求。 Csrf 攻击正是这样做的。我正在询问有关创建令牌并为客户端提供服务的问题,并且服务器会记住颁发给特定用户的令牌。
  • @SaranshMohapatra:CSRF 攻击向量是页面本身,一个共同的目标是窃取 cookie,将其发送到另一台服务器。设置http_only 可以防止这种情况发生。也可以将include_ip设置为True,将cookie绑定到特定的IP地址,这样窃取cookie是没有意义的。 cookie 是一个令牌,它使用安全散列(带有服务器端机密)对登录用户的用户名进行编码。
  • @SaranshMohapatra:此 cookie 与 CSRF 保护没有任何关系,因为您使用 the session cookie 设置执行表单令牌。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-05
  • 1970-01-01
  • 2021-03-31
  • 1970-01-01
  • 1970-01-01
  • 2010-12-04
  • 2014-11-26
相关资源
最近更新 更多