Cookie是会话的常见且安全的实现吗?

时间:2012-03-06 00:35:19

标签: python session cookies pyramid

我正在使用金字塔网页框架。我对cookie和会话之间的关系感到困惑。在维基百科中查找之后,我是否知道会话是一个抽象概念,而cookie可能只是一种方法(在客户端)。

所以,我的问题是,最常见的实现是什么(在客户端和服务器上)?有人可以给出一些例子(也许只是描述)代码吗? (我不想在金字塔内使用提供的会话支持来学习

3 个答案:

答案 0 :(得分:3)

最常见的会话实现是使用cookie。

Cookie提供了一种存储任意文本的方法,通常用作会话标识符。当cookie与HTTP请求一起发送时,服务器(从技术上讲,在其上运行的代码)可以使用cookie文本(如果存在)来识别它之前已经看过客户端。 cookie中的文本通常提供足够的信息来从数据库中检索有关此客户端的额外信息。

例如,一个非常天真的实现可能会将主键存储到数据库中的shopping_cart表中,这样当服务器收到cookie文本时,它可以直接使用它来访问该特定的相应购物车客户端。

(这是一种天真的方法,因为用户可以做一些事情,比如将自己的cookie更改为不同的主键并以这种方式访问​​其他人的推车。选择正确的会话ID isn't as simple as it seems,这就是为什么它几乎总是最好使用现有的会话实现。)

另一种方法是存储会话标识符是为了在url中使用GET参数(例如,在http://example.com/some/page?sid=4s6da4sdasd48之类的内容,那么sid GET参数与cookie具有相同的功能串)。在这种方法中,网站上其他页面的所有链接都附加了GET参数。

答案 1 :(得分:2)

通常,与客户端一起存储的cookie只是一个很长的,难以猜测的哈希代码字符串,可以用作数据库的密钥。在服务器端,您有一个表将这些会话哈希映射到主键(会话哈希从不是主键)和到期时间戳。

因此,当您收到请求时,首先要做的就是查找cookie。如果没有,请在数据库表中创建会话条目(cookie +到期时间戳)。如果有的话,查找并确保它没有过期;如果有,请制作一个新的。在任何一种情况下,如果您创建了一个新cookie,您可能希望将该事实传递给以后的代码,以便它知道是否需要请求登录或其他内容。如果您不需要创建新cookie,请重置过期时间戳,以免过早过期。

在处理视图代码并生成响应时,您可以使用该会话主键索引到具有与会话关联的数据的其他表。最后,在发送回客户端的响应中,将cookie设置为会话密钥哈希值。

如果某人禁用了Cookie,那么他们的会话Cookie将始终是新的,并且任何基于会话的功能都将无效。

答案 2 :(得分:1)

会话(通常)是具有唯一值的cookie。此值映射到数据库中的值或保存在内存中,然后告诉您要加载的会话。 PHP有一种替代方法,它在每个URL的末尾附加一个唯一值(如果你曾经在URL中看到PHPSESSID,你现在知道为什么),但这具有安全隐患(理论上)。

当然,由于每次请求都会来回发送Cookie,除非您通过HTTPS进行通话,否则您发送的唯一方法是(可靠地)知道您正在与之通话的客户端与您登录的客户端相同几秒钟前,同一个无线网络上的任何人。请参阅像Firesheep这样的程序,了解为什么切换到HTTPS是一个好主意。

最后,如果你确实想建立自己的我,那么大学教授就这件事提出了一些建议。如果使用了无效令牌,则在每次加载页面时都会发出新令牌,并使所有用户令牌无效。这只是意味着如果攻击者确实获得了一个令牌并登录到它,而当受害者点击链接时它仍然有效,则双方都会被注销。