php - PHP Session:ID 仅在服务器端生成?
问题描述
考虑以下 PHP 脚本:
<?php
session_start();
echo session_id();
当您通过浏览器打开此页面时,您应该会看到服务器生成的会话 ID。
对于标准的 php.ini 设置,此会话 ID 可能是 32 个字符,范围为 0-9 av(每个字符 5 位)。例子:
va9o92iefqoe0ouiado99r9hr299oamc
现在,假设您在浏览器中手动将 cookie 的会话 ID 从va9o92iefqoe0ouiado99r9hr299oamc
更改为z
,然后再次访问上述脚本:
起初,我希望 PHP 应该足够聪明,能够识别出这样的会话 ID 不是由服务器生成的,因此应该忽略它,并且应该在服务器端生成一个新的。不幸的是,事实并非如此。z
实际上,PHP 只是作为会话 ID前进。
我不确定恶意用户如何利用它,但我不喜欢在客户端生成会话 ID 的想法。
问题
我错过了什么吗?如果没有,如何加强 PHP 会话以缓解此类问题?
解决方案
根据php.ini:
; Whether to use strict session mode.
; Strict session mode does not accept an uninitialized session ID, and
; regenerates the session ID if the browser sends an uninitialized session ID.
; Strict mode protects applications from session fixation via a session adoption
; vulnerability. It is disabled by default for maximum compatibility, but
; enabling it is encouraged.
; https://wiki.php.net/rfc/strict_sessions
session.use_strict_mode = 0
此外,可在PHP 手册中找到:
何时启
session.use_strict_mode
用。您不必删除过时的会话 ID cookie,因为当没有与会话 ID 关联的数据并设置新的会话 ID cookie 时,会话模块将不接受会话 ID cookie。建议对所有站点启用。session.use_strict_mode
因此,只需更改为session.use_strict_mode = 1
即可避免客户端生成会话 ID。
推荐阅读
- apache-spark - Jupyter Notebook 如何与 Spark 集群通信
- leaflet - 传单和 WMS 版本 >= 1.3.0
- java - 有没有任何方法可以在没有任何连接的情况下检查日期是否正确(在没有篡改尝试的情况下)?
- flutter - 如何在渲染任何东西之前等待未来?
- lua - 如何在love2D中生成随机十进制数?
- json - 递归jsonSchema最大调用栈
- html - 我的下拉菜单在悬停时不会保持打开状态
- python-3.x - 在 Python 中的每个指定分隔符之间插入下一行
- julia - @with_kw 在 Julia 中做了什么?
- reactjs - Jest 快照测试在本地通过但在 Jenkins 上失败