gpt4 book ai didi

php - 使用 session ID 验证用户身份——这样做安全吗?

转载 作者:行者123 更新时间:2023-11-29 13:38:48 24 4
gpt4 key购买 nike

我正在使用 PHP (Zend) 和 MySQL 从头开始​​编写一个购物车程序。现在我正在实现访客购物车,并将购物车中的商品保存到数据库的表中。因此表中的每一项都有以下字段:

item_id session_id some_other_details_fields

当用户访问网站时,我使用 session_start() 分配一个 session ID,如果他或她向购物车添加了一些内容,我会在上面的表格中插入一行。

因此,当用户想要编辑或从购物车中删除某些内容时,他们可以执行以下操作:

mydomain/cart/edit?item_id=XXX

mydomain/cart/delete?item_id=XXX

一个明显的问题是,用户可以故意更改 XXX 以访问他人的商品信息或从他人的购物车中删除商品。所以我正在考虑添加 mydomain/cart/edit?item_id=XXX&sess_id=YYY 来验证 sess_id YYY 是否与数据库中项目 XXX 的 session_id 匹配。

我不知道这是否是一个好的做法,以及使用 session ID 来验证用户身份是否足够。对此的任何想法或引用都将受到高度赞赏。

编辑:

  1. 我希望将购物车中的商品保存尽可能长的时间(例如最多 1 年),因此我使用 Cookie 中存储的 session ID 来识别用户并保存他们的信息数据库中的购物车中的商品,以确保只要用户不清理其 cookie,购物车中的商品就不会丢失。 我认为 session 通常用于存储较短时间的用户数据,并且可能不如数据库可靠,如果这是错误的,请告诉我。

  2. 对于注册用户,我为他们的购物车使用单独的表,并使用 user_id 来识别他们。如果客人注册,我会将他们的元素从“客人购物车表”移动到“注册用户购物车表”。为了安心,我宁愿手动清理“访客购物车表”,而不是使用可能不时被意外清理的 session 。

  3. 我是 Zend 新手,所以不太确定如何使用 Zend 类编写此代码。所以我决定使用 php 来做这些事情。

如果我上面做的事情很愚蠢,请纠正我。 :)

最佳答案

我无法完全理解你的设计。使用数据库建议永久存储,但将购物车绑定(bind)到 session 意味着用户无法注册和保留其购物车。

  • 如果购物车只是 session 数据,它应该直接存储到 $_SESSION 中。
  • 如果购物车是永久性的,则 key 应为 user_id
  • 如果您希望 session 购物车在用户注册时可以选择保存到数据库中,则可以同时使用这两种方法或仅使用数据库。如果您选择后者,user_id 将是可选的,$_SESSION 将包含 cart_id

此外,事实证明,在 URL 中传输 session ID(早期 PHP 版本中的默认行为)是一个错误的想法:很容易无意中泄露 session 数据(例如,仅向 friend 发送链接)。

综上所述:通常不需要使用 session ID。

<小时/>

我刚刚注意到您的编辑:

I would like to save the items in cart for as long as possible (e.g., up to 1 year), so I use session ID stored in cookies to identify users and save their items in cart in the database to make sure it will not be lost as long as the users do not clean up their cookies.

所以购物车实际上与 PHP session 无关。使用 session ID 作为购物车标识符不必要地将整个 session 功能与您的数据库购物车链接起来,并增加了很多额外的麻烦,但没有任何好处:

  • 您需要更改默认 session 设置,以便 session Cookie 在浏览器重新启动后仍然保留。

  • 连续几个月重复使用同一个 ID 会增加 session 劫持的风险。

您确定您所说的不是cookie而是 session 吗?生成一个很长的随机字母数字标识符,将其存储到 cookie 中,并将其用作数据库表的辅助键就可以了。

<小时/>

后续问题

In terms of safety, would it be sufficient to generate just one long alphanumeric "GUID" for each guest and use that "GUID" to verify the identity when he or she comes back?

它不需要全局(GUID 中的 G),但我想它不会有什么坏处。但你需要定义“足够”。将数据绑定(bind)到 IP 地址或用户代理字符串使攻击者更难获得访问权限,并使用户更容易丢失数据。仅使用 HTTPS 会使您在任何地方都需要使用 HTTPS 时更加安全。

To avoid "GUID" conflicts, is there a good point to start? I used session ID just because it will generate a "GUID" for me.

抱歉, session ID 不是 GUID:它只是带有随机种子的加密哈希。但请想一想:购买从 00000 到 99999 的彩票(即 1/100000 的机会),中奖是极其困难的。如果生成包含数字和 26 个英文字母的 32 个字符的字符串,则得到 1/36^32 = 1.5787740357426709877210×10-50

For my case when shall I use sessions (as a best practice)? I'm kinda lost if this is not a good scenario to use sessions. Many thanks!

您可能已经在使用 session 来进行用户登录或订单支付,这是有充分理由的:由于 HTTP 是无状态协议(protocol),因此没有其他方法可以做到这一点。为什么不惜一切代价将购物车存放在 session 中如此重要? ;-)

关于php - 使用 session ID 验证用户身份——这样做安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18400469/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com