我刚刚开始使用python学习Web应用程序开发。我遇到了术语“ cookies”和“ sessions”。我了解Cookie,因为它们在浏览器的键值对中存储了一些信息。但是我对会话有一些困惑,在会话中,我们也将数据存储在用户浏览器的cookie中。例如-我使用username='rasmus'password='default'登录。在这种情况下,数据将被发布到服务器,如果经过身份验证,该服务器应该检查并登录我。但是,在整个过程中,服务器还会生成一个会话ID,该会话ID将存储在我的浏览器的Cookie中。现在,服务器还将此会话ID存储在其文件系统或数据存储中。

但是仅基于会话ID,在以后遍历网站时如何知道我的用户名?它是否将数据存储在服务器上作为dict,其中密钥将是会话ID,而诸如usernameemail等详细信息是值?需要帮助。

评论

“它是否将数据存储在服务器上作为字典,其中密钥将是会话ID,而用户名,电子邮件等详细信息将是值?” ...是。 “ dict”可能是一个关系数据库,但基本上就是这样。

我现在也想了解网络会话。如果有什么帮助,我最终写了自己的Wiki:machinearedigging.com/2013/10/29/how-does-a-web-session-work

如果您不知道:即使对密码进行了哈希处理,在客户端存储密码也是不安全的(实际上,这没有什么区别。Cracker可以通过创建伪造的cookie直接输入哈希化的密码)是存储登录状态的更好方法。

我使用协议级别的详细信息写了自己的东西-bitspedia.com/2012/05/…

#1 楼

由于HTTP是无状态的,因此为了将请求与任何其他请求相关联,您需要一种在HTTP请求之间存储用户数据的方法。

Cookie或URL参数(例如,例如http://example.com/myPage?asd=lol&boo=no)都是在2个或更多请求之间传输数据的合适方法。
但是,如果您不希望在客户端对数据进行可读/可编辑的话,那么它们就不好用了。

解决方案是将数据存储在服务器端,给它一个“ id”,然后让它客户端仅知道(并在每个http请求处传递)该ID。到这里,会议已实施。或者,您可以将客户端用作方便的远程存储,但是您可以对数据进行加密,并保留服务器端的秘密。要劫持他人的会话,您希望会话不会永远持续下去而是要终止,依此类推。

在您的特定示例中,用户ID(可以是用户名或用户数据库中的另一个唯一ID)是成功识别后,存储在会话数据中的服务器端。然后,对于您从客户端收到的每个HTTP请求,会话ID(由客户端提供)会将您指向包含经过身份验证的用户ID的正确会话数据(由服务器存储),这样您的代码就会知道该用户是哪个用户正在与之交谈。

评论


“您不希望该数据在客户端维护”。为什么不?如果您使用强大的加密技术,则可以让客户端保留加密并存储在cookie中的会话数据。由于服务器不需要“记住”任何内容,因此极大地简化了扩展到多个节点的过程。

–马特·哈里森(Matt Harrison)
15年1月30日在20:56



@MattHarrison您将如何在不“记住任何内容”服务器端的情况下解密数据?无论如何,我都试图在我的答案中扩展这个主题。

–Luke404
2015年2月2日,10:00

@MattHarrison请记住,在用户端存储大量数据将增加您的访问量。

– nitsas
2015年6月25日在11:21



如果第三方可以拦截用户的会话密钥,那么第三方是否可以充当用户?假设该站点未使用HTTPS,即使该密钥已加密,似乎第三方也可能伪装成具有会话密钥的用户。服务器只会解密它。

–user137717
2015年8月1日在4:31

@ user137717是的,如果您允许访问会话的字面意思是“每个提供正确会话ID的用户”,那么这是可能的。您可以设置许多限制,最简单也是最常见的限制之一是将客户端IP存储在会话中:如果来自另一个IP的客户端显示相同的会话ID,则将其标记为伪造并删除会话。

–Luke404
17年8月8日在14:03

#2 楼

用类比简单解释
想象您在一家银行,试图从您的帐户中取钱。但是天黑了。银行是黑色的:没有光,你看不到手在你的面前。您被另外20个人包围。它们看起来都一样。每个人都有相同的声音。每个人都是一个潜在的坏人。换句话说,HTTP是无状态的。
这家银行是一种很有趣的银行-为了争辩,这里是事情的工作方式:您与柜员交谈:您要求提款,然后
您必须在沙发上短暂等待,然后20分钟后
您必须去实际从柜员那里取钱。

但是柜员会如何告诉您与其他人不同的地方?
请记住,柜员看不见或不能轻易认出您,因为灯光都熄灭了。如果您的出纳员将您的$ 10,000提款给其他人-错误的人呢?柜员必须将您识别为进行提款的人,这一点至关重要,这样您才能获得所需的钱(或资源)。 ,他(或她)秘密地告诉您一些事情:

“出纳员说,”无论您何时与我交谈,“您应该首先将自己标识为GNASHEU329-这样我就知道是您”。 br />
没人知道秘密密码。
我提取现金的示例:说“我想取回我的提款”
出纳员问我:“你是谁?!”
“是我,乔治·班克斯先生!”
“证明!”
然后我告诉他们我的密码:GNASHEU329
这基本上就是会话的工作方式。它使一个人可以在成千上万人的海洋中得到唯一标识。每次与柜员打交道时,您都需要证明自己的身份。
如果您有任何疑问或不清楚-请发表评论,我会尽力为您解决。以下内容并不是严格意义上的,其术语完全准确,但是希望对您理解概念有所帮助。
通过图片进行解释:


评论


喜欢这个解释-打个比方,您如何防止其他人窃听他人的电话,并听到柜员告诉您的秘密密码?换句话说,如果session_id被盗,有人无法模仿您的凭据吗?

– wmock
17年4月15日在17:08

@wmock会话劫持肯定是一个问题:检查一下! owasp.org/index.php/Session_hijacking_attack

– BKSpurgeon
17年4月15日在18:39



可爱的例子!它应该与渴望学习的人分享!

–维克多
19年1月17日在17:06

以此类推,GNASHEU329是用户密码,它生成一个身份验证令牌,该令牌将一直过期直到某个时间;然后,班克斯先生可以使用auth令牌连续进行几次提款,而不必反复给出纳员输入密码?

–丹尼尔·利兹克(Daniel Lizik)
3月9日5:11

@DanielLizik你是def。了解概念!但是我对基于令牌的工作流知识不足,无法为您提供明智的答案。一般原则是服务器需要能够以某种方式识别谁是发出请求的人。

– BKSpurgeon
3月9日5:59

#3 楼

“会话”是一个术语,用于表示用户浏览网站的时间。这表示从他们第一次到达网站页面到他们停止使用网站之间的时间。实际上,不可能知道用户何时完成了网站。在大多数服务器中,除非同一用户请求另一个页面,否则超时会自动结束会话。

创建用户第一次连接某种会话ID的方式(如何完成取决于网络服务器软件以及您在网站上使用的身份验证/登录类型)。
像cookie一样,由于安全性问题,通常不会再通过URL发送该消息。相反,它与一堆其他东西(也统称为会话)一起存储。会话变量就像cookie一样-它们是与页面请求一起发送的名称-值对,并随服务器从页面返回-但它们的名称是在网络标准中定义的。会话变量作为HTTP标头传递。它们是在每次浏览页面的背后来回传递的,因此它们不会出现在浏览器中并告诉所有人可能是私有的信息。其中包括USER_AGENT或请求页面的浏览器类型,REFERRER或链接到所请求页面的页面等。某些Web服务器软件添加其自己的标头或传输特定于服务器软件的其他会话数据。但是标准的文档已被很好地记录下来。

希望有所帮助。

评论


我知道在使用的IIS服务器上,可以从USER_NAME标头获取用户名,但这可能是特定于IIS的。

–蒂姆·洛克(Tim Rourke)
2010-09-27 15:36

REFERRER在这里是什么意思?

– Gab是好人
15年8月13日在12:00

@Gab是好人REFERRER通常是指客户端在“ Referer” HTTP请求标头中发送的任意字符串。它应该包含资源的URL,您知道该URL将客户端引向当前资源。

–Luke404
17年8月8日在14:05

谢谢,它应该,但不一定。所以我认为人们经常以与RFC中建议的语义不同的方式使用此标头,对吗?

– Gab是好人
17年8月8日在15:02

首先,您编写了Like Cookies,通常不会再通过URL发送该消息,然后Session变量就像Cookies一样-它们是与请求页面一起发送的名称/值对。到底会发生什么?下次发出请求时会发送吗?

–ajaysinghnegi
1月28日21:15

#4 楼

HTTP是无状态连接协议,即服务器无法区分不同用户的不同连接。

因此出现cookie,一旦客户端第一次连接到服务器,服务器就会生成一个新的会话ID,稍后将其作为cookie值发送给客户端。从现在开始,此会话ID将标识该客户端连接,因为在每个HTTP请求中,它将在cookie中看到适当的会话ID。

现在,对于每个会话ID,服务器都会保留一些数据结构,这使他可以存储特定于用户的数据,您可以抽象地调用会话。

评论


您是否可以对此进行更多说明-“现在,对于每个会话ID,服务器保留一些数据结构,这使他可以存储特定于用户的数据,您可以抽象地调用会话。”服务器存储哪些特定的客户端信息?

– realPK
14年2月27日在18:00

您是否可以对此进行更多说明-“现在,对于每个会话ID,服务器保留一些数据结构,这使他可以存储特定于用户的数据,您可以抽象地调用会话。”服务器存储哪些特定的客户端信息?

– Gab是好人
15年8月13日在11:59

与上述问题相同,如果您回答,将会很有帮助。

–苏拉杰(Suraj Jain)
17年12月30日在5:58

#5 楼

将HTTP想象成一个人(A),它拥有短期记忆丢失,并且在该人失踪后就忘记了每个人。

现在,为了记住不同的人,A拍摄了一张照片人并保留它。每个人的照片都有一个ID号。当那个人再次出现时,那个人将其ID号告诉给A,A便通过ID号找到了自己的照片。与HTTP。它正在遭受短期记忆丢失。它使用Sessions记录您在使用网站时所做的一切,然后当您再次访问时,它借助Cookies(Cookie就像一个令牌)来识别您。
这里的Session是图片,ID是此处的Cookie。