NoteDeep
cookie
把session的cookie过期时间,以及gc时间都调整到一天。


1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
每次请求都要进行网络传输,占用带宽
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

php配置:

session.cookie_lifetime
cookie保存时间,如果为0,则只在浏览器关闭之前保存。

session.cookie_path=/
session.cookie_domain=
这两项相当于是cookie的作用域。不同域名下,cookie互不可见。但是如果把某个cookie的域名设置为notedeep.com (前面没有www),所有notedeep.com 的二级域名也是访问到的。

当 handler 为文件时:
session 延期是自动的。
我们知道SESSION的回收机制是根据SESSION文件的最后访问时间来判断的,如果超过了maxlifetime,则根据回收机率进行回收。所以我们只需要定期的去访问一下SESSION就可以了,而这可以通过刷新页面来实现。
所以对于已经登陆的用户,他的每个请求都已经在访问session,想要延长他的自动登陆时间,只需要延长cookie的时间以及设置maxlifetime即可

session_start 时,就会把 session 数据读取到 $_SESSION 中,无论背后的 handler 是 redis 还是 file。
如果 session_start(['read_and_close' => true]),表示只读,并且读取到 $_SESSION 中之后,立刻结束会话。

只有这次请求需要写 session 时,才设置 read_and_close 为 false。
此时只有当前进程可以读写 session,别的进程甚至不能读,除非用 session_write_close() 释放锁,session_write_close 是把 $_SESSION
通过 handler 写到 redis 或者 file 中。

一般可以当需要写的时候,重新执行session_start(), 让当前进程可以写。写完之后立刻执行 session_write_close() 释放锁

参考:
https://www.php.net/manual/en/function.session-set-save-handler.php
https://www.php.net/manual/en/function.session-write-close.php
https://www.php.net/manual/en/function.session-start.php
https://www.php.net/manual/en/session.configuration.php#ini.session.save-handler

session-set-save-handler 当某个会话只需要读 session 时,的第二个参数可以传 false。
没必要最后在 shutdown 的时候再写一次, $_SESSION 又没改变。如果要写,写完后,手动调用 session_write_close 即可。


session.gc_probability
session.gc_probabilitysession.gc_divisor 合起来用来管理 gc(garbage collection 垃圾回收)进程启动的概率。默认为 1

session.gc_divisor
session.gc_divisorsession.gc_probability 合起来定义了在每个会话初始化时启动 gc(garbage collection 垃圾回收)进程的概率。此概率用 gc_probability/gc_divisor 计算得来。例如 1/100 意味着在每个请求中有 1% 的概率启动 gc 进程。session.gc_divisor 默认为 100

session.gc_maxlifetime
session.gc_maxlifetime 指定过了多少秒之后数据就会被视为“垃圾”并被清除。 垃圾搜集可能会在 session 启动的时候开始

安全方面:

session.cookie_httponly cookie只能在后端获取,js获取不到, 防止了xss。
session.cookie_secure = 1
如果开启则表明你的cookie只有通过HTTPS协议传输时才起作用。

session.use_only_cookies booleansession.use_only_cookies 指定是否在客户端仅仅使用 cookie 来存放会话 ID。。启用此设定可以防止有关通过 URL 传递会话 ID 的攻击。此设定是 PHP 4.3.0 添加的。自PHP 5.3.0开始,默认值改为1(启用)

cookie session。cookie被禁用了怎么办

session.use_cookies booleansession.use_cookies 指定是否在客户端用 cookie 来存放会话 ID。默认为 1(启用)。

url重写技术,把session id 放到url上面。
拿到refer其实就可以比较方便的判断上一次是否在url里面存在session id
session.use_trans_sid booleansession.use_trans_sid 指定是否启用透明 SID 支持。默认为 0(禁用)。
Note: 基于 URL 的会话管理比基于 cookie 的会话管理有更多安全风险。例如用户有可能通过 email 将一个包含有效的会话 ID 的 URL 发给他的朋友,或者用户总是有可能在收藏夹中存有一个包含会话 ID 的 URL 来以同样的会话 ID 去访问站点。
一些自己的思考, 考虑到这样很不安全,
是否可以在url里再增加一个access_token, 前端从后端获取。
后端控制access_token每一个小时过期,通过sessionid + access_token 来识别用户是否有权访问。
如果access_token失效,前端需要重新发起请求,获取新的access_token。
这样是不是就能在一定程度上减轻安全风险。



评论列表

    php配置:
    安全方面:
    cookie session。cookie被禁用了怎么办