Cookie与会话

Nad*_*ami 175 php cookies session

几个月前我开始使用PHP.为了为我的网站创建登录系统,我阅读了有关cookie和会话及其差异的信息(cookie存储在用户的浏览器和服务器上的会话中).那时候,我更喜欢饼干(谁不喜欢饼干?!)并且只是说:"谁在乎?我没有任何好处将它存储在我的服务器中",所以,我继续使用cookies我的学士毕业设计.然而,在完成我的应用程序的重要部分之后,我听说对于存储用户ID的特定情况,会话更合适.所以我开始考虑如果陪审团问我为什么用饼干代替会话,我会怎么说?我有这个原因(我不需要存储有关用户的内部信息).那是不够的一个原因?还是不止于此?
能告诉我使用cookies保存用户ID的优缺点吗?

感谢StackOverflow中的所有人!

Fos*_*sco 211

该概念是为Web访问者存储跨页面加载的持久数据.Cookie将其直接存储在客户端上.会话使用cookie作为排序的关键,以与存储在服务器端的数据相关联.

最好使用会话,因为实际值是从客户端隐藏的,您可以控制数据何时到期并变为无效.如果全部基于cookie,则用户(或黑客)可以操纵他们的cookie数据,然后向您的站点播放请求.

编辑:我认为使用cookie没有任何优势,除了简单.以这种方式看待它......用户是否有任何理由知道他们的ID#?通常我会说不,用户不需要这些信息.提供信息应限于需要知道的基础.如果用户将其Cookie更改为具有不同的ID,您的应用程序将如何响应该怎么办?这是一个安全风险.

在会议风靡一时之前,我基本上都有自己的实现.我在客户端上存储了一个唯一的cookie值,并将我的持久数据与该cookie值一起存储在数据库中.然后在页面请求我匹配这些值并拥有我的持久数据,而不让客户端控制那是什么.

  • @JiminyCricket我不认为这是真的......如果是这样的话,没有人会使用会话变量来存储当前登录的用户 - 而且每个人都这样做.这将是一个巨大的安全风险.非常确定会话ID通常作为cookie存储在客户端计算机上,然后在服务器端与会话数据进行匹配.服务器通常不通过IP地址控制会话,而是通过cookie值控制会话. (26认同)
  • 我最近又开始只使用 cookie,纯粹是因为如果当前正在从同一个会话中执行另一个会话,会话会使页面无法加载,除非您在需要时使用 `session_write_close();` 作为每个页面的前言。滚动您自己的唯一 ID 并与普通 cookie 匹配并没有那么困难,并且可以使所有页面保持美观和活泼。 (2认同)

小智 114

区分这两者的基本思路.

会议:

  1. IDU存储在服务器上(即服务器端)
  2. 更安全(因为1)
  3. 无法设置过期,当用户关闭浏览器时,会话变量将过期.(现在它在php中默认存储了24分钟)

饼干:

  1. IDU存储在Web浏览器上(即客户端)
  2. 不太安全,因为黑客可以访问并获取您的信息(因为1)
  3. 可以设置到期时间(有关更多信息,请参阅setcookies())

当您需要存储短期信息/值时,首选会话,例如计算,测量,查询等变量.

当您需要存储长期信息/值(例如用户帐户)时,首选Cookie(这样即使他们关闭计算机2天,他们的帐户仍会登录).我想不出很多关于cookie的例子,因为在大多数情况下都没有采用它.

  • 请注意:这不是一个好的答案.它开始很好,但混淆了事情并以虚假信息结束.这不是会话与Cookie的解释.这是会话与会话+会话cookie的解释.由于上述原因,单独使用Cookies不是首选.由于上述原因,会话+会话cookie是首选. (4认同)
  • Sessions 仍然在用户浏览器上设置了一个 cookie,所以这个服务器客户端的解释是不准确的 (4认同)
  • IDU代表什么? (3认同)
  • 我明白了,感谢BeingSimpler,真实的你很简单^^! (2认同)
  • 另一个错误是您确实通过 PHP 配置影响了会话生存期。 (2认同)

Zal*_*oza 42

SESSIONS ENDS WHEN USER CLOSES THEIR BROWSER,

COOKIES END DEPENDING ON THE LIFETIME YOU SET FOR IT. SO THEY CAN LAST FOR YEARS
Run Code Online (Sandbox Code Playgroud)

这是您选择的主要区别,

如果你想长时间记住id,那么你需要使用cookies; 否则,如果您只是希望网站识别此次访问的用户,那么会话就是最佳选择.

会话存储在php服务器将生成的文件中.为了记住哪个文件是针对哪个用户,php还会在用户的浏览器上设置一个cookie,用于保存此会话文件ID,因此在下次访问时,php将读取此文件并重新加载会话.

现在,php默认会在每个时间间隔清除会话,并且会话的命名约定使其自动过期.此外,一旦浏览器关闭或清除历史记录,浏览器将不会保留包含会话ID的cookie.

重要的是要注意,现在浏览器还支持另一种存储引擎,例如LocalStorage,SessionStorage和其他webdb引擎,javascript代码可以使用这些引擎将数据保存到您的计算机以便记住您.例如,如果您在Facebook中打开javascript控制台并输入"localStorage",您将看到Facebook用于记住您的所有变量而没有Cookie.

  • 实际上,默认情况下会话会一直持续到用户关闭浏览器为止,但是这可以在php.ini文件中更改,方法是将session.cookie_lifetime = 0中的0更改为您希望会话持续的秒数,或者使用session_set_cookie_params(). (16认同)

Fif*_*ifi 35

简答

按优先级排序的规则:

  • 规则 1. 永远不要相信用户输入:cookies 是不安全的。对敏感数据使用会话。
  • 规则 2. 如果在用户关闭浏览器时必须保留持久数据,请使用 cookie。
  • 规则 3. 如果用户关闭浏览器时不需要保留持久数据,请使用会话。
  • 规则4.阅读详细答案!

来源:https : //www.lucidar.me/en/web-dev/sessions-or-cookies/


详细解答

饼干

  • Cookie 存储在客户端(在访问者的浏览器中)。
  • Cookie 并不安全:读取和写入 Cookie 内容非常容易。
  • 使用 cookie 时,您必须根据欧洲法律 (GDPR) 通知访问者。
  • 可以设置过期时间,但用户或浏览器可以更改它。
  • 用户(或浏览器)可以(设置为)拒绝使用 cookie。

会话

  • 会话存储在服务器端。
  • 会话使用 cookie(见下文)。
  • 会话比 cookie 更安全,但并非无懈可击。
  • 到期时间在服务器配置中设置(例如 php.ini)。
  • 默认过期时间为 24 分钟或浏览器关闭时。
  • 当用户刷新或加载新页面时会重置过期时间。
  • 用户(或浏览器)可以(设置为)拒绝使用 cookie,从而拒绝会话。
  • 从法律上讲,您还必须通知访问者获取 cookie,但尚不清楚是否有先例。

合适的选择

会话使用cookie!会话数据存储在服务器端,但 UID 存储在客户端的 cookie 中。它允许服务器将给定的用户与正确的会话数据进行匹配。UID 受保护且难以破解,但并非无懈可击。对于敏感操作(更改电子邮件或重置密码),不要依赖会话和 cookie:要求输入用户密码以确认操作。

敏感数据不应存储在 cookie(电子邮件、加密密码、个人数据……)中。请记住,数据存储在外国计算机上,如果计算机不是私人计算机(教室或公共计算机),其他人可能会读取 cookie 内容。

记住我的数据必须存储在cookies中,否则用户关闭浏览器时数据会丢失。但是,请勿在“记住我”cookie 中保存密码或用户个人数据。将用户数据存储在数据库中,并将此数据与存储在 cookie 中的加密 ID/密钥对链接。

在考虑了之前的建议之后,以下问题最终可以帮助您在 cookie 和会话之间进行选择:

用户关闭浏览器时必须保留持久数据吗?

  • 如果答案是肯定的,请使用cookie
  • 如果答案是否定的,请使用会话


Mak*_*ebi 20

当您将#ID保存为cookie以识别登录用户时,实际上您正在向与其无关的用户显示数据.此外,如果第三方尝试在浏览器中将随机ID设置为cookie数据,他们将能够说服服务器他们是用户,而实际上并非如此.那是缺乏安全感.

您已经使用过cookie,正如您所说,您已经完成了大部分项目.除了cookie有特权保留很长时间,而会话结束更快.因此会话不适用于这种情况.实际上,许多着名且受欢迎的网站和服务都使用cookie,您可以长时间保持登录状态.但是,如何使用他们的方法创建更安全的登录过程?

这里有一个想法:你可以帮助你使用cookies的方式:如果你使用随机密钥而不是ID来识别登录用户,首先,你不要将你的主要数据泄露给随机用户,其次,如果你考虑随机密钥足够大,任何人都难以猜测密钥或创建随机密钥.例如,您可以在用户的​​浏览器中保存这样的40长度密钥:"KUYTYRFU7987gJHFJ543JHBJHCF5645UYTUYJH54657jguthfn",任何人创建确切密钥并伪装成其他人的可能性就会降低.


DOK*_*DOK 12

实际上,会话和cookie并不总是分开的.通常,但并非总是如此,会话使用cookie.

这里的其他问题对你的问题有一些很好的答案.由于您的问题特别是关于保存用户的IDU(或ID),我不认为它与其他问题完全重复,但他们的答案应该对您有所帮助.

cookies与会话

缓存VS Session VS cookies?

会话和Cookie之间有什么区别?


Muh*_*lah 9

我个人使用cookies和会话.

Cookie仅在用户点击"记住我"复选框时使用.并且cookie也是加密的,数据只在服务器上解密.如果有人试图编辑cookie,我们的解密者能够检测到它并拒绝请求.

我见过很多站点,其中登录信息存储在cookie中,任何人都可以只是简单地更改cookie中的用户ID和用户名来访问任何帐户.

谢谢,


Abe*_*ejo 9

TL; 博士

标准/因素 会话 饼干
纪元(存在的开始) 在 HTTP 响应之前创建 在 HTTP 响应之后创建
第一次 HTTP 请求期间的可用性 是的
后续 HTTP 请求期间的可用性 是的 是的
对数据和到期的终极控制 服务器管理员 最终用户
默认到期 比 cookie 更早过期 持续时间比会话长
服务器成本 记忆 记忆
网络成本 没有任何 不必要的额外字节
浏览器费用 没有任何 记忆
安全 难以劫持 容易劫持
弃用 没有任何 现在不鼓励使用 JavaScript“Web Storage”

细节

优点和缺点是主观的。它们可能导致二分法(对某些人来说是优势,但对其他人来说是劣势)。相反,我列出了可以帮助您决定选择哪一个的因素。

在第一个 HTTP 请求和响应期间存在

假设您是一个服务器端人员,想要同时处理会话和 cookie。第一次 HTTP 握手将像这样进行:

  1. 浏览器准备HTTP请求-会话:不可用; 饼干:不可用
  2. 浏览器发送 HTTP 请求
  3. 服务器收到 HTTP 请求
  4. 服务器处理HTTP请求-会话:存在; 饼干:演员表
  5. 服务器发送 HTTP 响应
  6. 浏览器收到 HTTP 响应
  7. 浏览器处理HTTP响应-会话:不可用; COOKIES:存在

在步骤 1 中,浏览器不知道会话和 cookie 的内容。在步骤 4 中,服务器可以有机会设置会话和 cookie 的值。

后续 HTTP 请求和响应期间的可用性

  1. 浏览器准备HTTP请求-会话: 不可用; 饼干: 可用
  2. 浏览器发送 HTTP 请求
  3. 服务器收到 HTTP 请求
  4. 服务器处理HTTP请求-会话:可用; 饼干:可用
  5. 服务器发送 HTTP 响应
  6. 浏览器收到 HTTP 响应
  7. 浏览器处理HTTP响应-会话:不可用; 饼干:可用

有效载荷

假设在单个网页中您正在加载由 托管的example.com20 个资源,这 20 个资源将携带有关 cookie 的额外字节信息。即使它只是对 CSS 或 JPG 图像的资源请求,它仍然会在通往服务器的途中在其标头中携带 cookie。对 JPG 资源的 HTTP 请求是否应该携带一堆不必要的 cookie?

弃用

会话没有替代品。对于 cookie,在浏览器中存储数据还有许多其他选项,而不是旧式 cookie

存储用户数据

Session 存储用户数据更安全,因为它不能被最终用户修改,只能在服务器端设置。另一方面,Cookie 可能会被劫持,因为它们只是存储在浏览器中。