2012-09-01 55 views
8

我正在第一次进入金字塔安全模块。我使用这个登录密码设置auth_tkt:Pyramid.security问题:双曲奇饼?饼干不安全?过期?

@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 != '[email protected]' 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是相同的(都使用名称“auth_tkt”),除了一个区别:一个主机值为“.www.mydomain.com”,而另一个cookie的主机值为“www.mydomain.com”为什么是2个饼干被设置而不是一个?差异主机价值的重要性是什么?

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

问题3:这两个cookie的过期值均为“会话结束时”。这是什么意思,我怎样才能自定义到期价值?登录Cookie到期时间的建议做法是什么?

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

+0

推测你的意思是'serverUserGUID ='1123123123'';你用这个变量名称来调用'remember'。 –

+0

谢谢你......我修正了错误。 – zakdances

回答

11
  1. 实际上,生成3个cookie;一个没有Domain键,一个没有,并且第三个与你的域的通配符版本(最前面的点)。您的浏览器通常会合并这两个或忽略其中一个(哪一个不同于浏览器,这就是设置2的原因)。

    当在AuthTktAuthenticationPolicy上设置wild_domain选项时,会生成最后的cookie(默认为true);请参阅AuthTktAuthenticationPolicy API。如果您的身份验证Cookie要在不同的子域之间共享(请考虑app1.domain,app2.domain);您的浏览器不会在没有通配符cookie的情况下跨子域共享Cookie。

  2. 您需要在您的身份验证策略中设置secure选项才能获取安全标志。再次请参阅API

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

    只有如果你想会话跨浏览器关闭最后,设置cookie最大的年龄,看到APImax_age选项。该选项将导致浏览器将cookie存储在磁盘上以在浏览器关闭之间保留,并在最大年龄过去时将其删除。

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

    有关如何配置该选项的更多详细信息,请参见API documentation中的timeoutreissue_time选项。

  4. 策略对象需要来自请求的几条信息才能生成cookie,而不仅仅是服务器的所有主机名。

+1

感谢您的澄清。我想知道的一件事是,AuthTKTAuthentication策略是否可以抵御csrf攻击?如果不是,我们如何才能使其安全。还有一件事我们如何将它用于连接到客户端移动应用程序的服务器。我想,饼干事情会很困难。而不会令牌选项更好? –

+1

将'http_only'设置为'True'告诉浏览器隐藏JavaScript中的Cookie;这使CSRF攻击窃取cookie无效。 Cookie只是HTTP标头,您的移动客户端必须像管理任何其他网站一样管理它们。不明白令牌选项的含义。 –

+0

我不确定这是否会阻止csrf攻击,cookie会自动附加到对其设置域的任何请求。 Csrf攻击就是这样做的。我正在询问有关创建令牌并向客户端提供服务的问题,服务器会记住向特定用户发布的令牌。 –