- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 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 年),因此我使用 Cookie 中存储的 session ID 来识别用户并保存他们的信息数据库中的购物车中的商品,以确保只要用户不清理其 cookie,购物车中的商品就不会丢失。 我认为 session 通常用于存储较短时间的用户数据,并且可能不如数据库可靠,如果这是错误的,请告诉我。
对于注册用户,我为他们的购物车使用单独的表,并使用 user_id 来识别他们。如果客人注册,我会将他们的元素从“客人购物车表”移动到“注册用户购物车表”。为了安心,我宁愿手动清理“访客购物车表”,而不是使用可能不时被意外清理的 session 。
我是 Zend 新手,所以不太确定如何使用 Zend 类编写此代码。所以我决定使用 php 来做这些事情。
如果我上面做的事情很愚蠢,请纠正我。 :)
最佳答案
我无法完全理解你的设计。使用数据库建议永久存储,但将购物车绑定(bind)到 session 意味着用户无法注册和保留其购物车。
$_SESSION
中。user_id
。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/
在为 Web 应用程序用例图建模时,为用户可以拥有的每个角色创建一个角色是否更好?或拥有一个角色、用户和一个具有特权的矩阵? guest < 用户 < 版主 < 管理员 1: guest 、用户、版主
我无法使用 Elixir 连接到 Postgres: ** (Mix) The database for PhoenixChat.Repo couldn't be created: FATAL 28P
这个问题已经有答案了: Group by field name in Java (7 个回答) 已关闭 7 年前。 我必须编写一个需要 List 的方法并返回 Map> . User包含 Person
感谢您的帮助,首先我将显示代码: $dotaz = "Select * from customers JOIN contracts where customers.user_id ='".$_SESS
我只想向所有用户中的一个用户显示一个按钮。我尝试了 orderByKey() 但没有成功! 用户模型有 id 成员,我尝试使用 orderByChild("id") 但结果相同! 我什至尝试了以下技巧
我们在工作中从 MongoDB 切换到 Postgres,我正在建立一个 BDR 组。 在这一步,我正在考虑安全性并尽可能锁定。因此,我希望设置一个 replication 用户(角色)并让 BDR
export class UserListComponent implements OnInit{ users; constructor(private userService: UserS
我可以使用 Sonata User Bundle 将 FOS 包集成到 sonata Admin 包中。我的登录功能正常。现在我想添加 FOSUserBundle 中的更改密码等功能到 sonata
在 LinkedIn 中创建新应用程序时,我得到 4 个单独的代码: API key 秘钥 OAuth 用户 token OAuth 用户密码 我在 OAuth 流程中使用前两个。 的目的是什么?最后
所以..我几乎解决了所有问题。但现在我要处理另一个问题。我使用了这个连接字符串: SqlConnection con = new SqlConnection(@"Data Source=.\SQLEX
我有一组“用户”和一组“订单”。我想列出每个 user_id 的所有 order_id。 var users = { 0: { user_id: 111, us
我已经为我的Django应用创建了一个用户模型 class User(Model): """ The Authentication model. This contains the u
我被这个问题困住了,找不到解决方案。寻找一些方向。我正在用 laravel 开发一个新的项目,目前正致力于用户认证。我正在使用 Laravels 5.8 身份验证模块。 对密码恢复 View 做了一些
安装后我正在使用ansible配置几台计算机。 为此,我在机器上本地运行 ansible。安装中的“主要”用户通常具有不同的名称。我想将该用户用于诸如 become_user 之类的变量. “主要”用
我正在尝试制作一个运行 syncdb 的批处理文件来创建一个数据库文件,然后使用用户名“admin”和密码“admin”创建一个 super 用户。 到目前为止我的代码: python manage.
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 6 年前。 Improv
我已在 Azure 数据库服务器上设置异地复制。 服务器上运行的数据库之一具有我通过 SSMS 创建的登录名和用户: https://learn.microsoft.com/en-us/azure/s
我有一个 ionic 2 应用程序,正在使用 native FB Login 来检索名称/图片并将其保存到 NativeStorage。流程是我打开WelcomePage、登录并保存数据。从那里,na
这是我的用户身份验证方法: def user_login(request): if request.method == 'POST': username = request.P
我试图获取来自特定用户的所有推文,但是当我迭代在模板中抛出推文时,我得到“User”对象不可迭代 观看次数 tweets = User.objects.get(username__iexact='us
我是一名优秀的程序员,十分优秀!