【PHP小课堂】深入学习PHP中的SESSION(二)

深入学习PHP中的SESSION(二)

今天的学习内容没有太多的代码,主要还是以理论经验为主,当然,主要的依据还是来源于 PHP 官方文档中的说明。在日常的业务开发中,SESSION 安全一直是我们最主要也是最关心的内容,不管是面向前端的用户还是面向后台的管理员,SESSION 泄露可能都会带来严重的问题。这是我们需要重点的考虑的内容之一。

会话安全

从上篇文章中我们了解到,其实 SESSION 之所以能够实现,最核心的内容就是那个 phpsessid ,也就是 session id 。这个就相当于是一个密钥,有了它,我们就可以随便登录我们的系统了。不少小伙伴一下就明白了,要么从 url 中获取,要么从 Cookie 中获取,这个 session id 总共也就这两种传递的形式。

没错,所以在正常情况下一般都不推荐使用 url 形式来传递这个 session id ,毕竟明文地在连接中简直是太方便获取到了。而 Cookie 的话,比较建议的是设置 Cookie 的 secure 和 http_only 这两个选项。 secure 的作用是让 Cookie 只能通过 https 来进行传输,而 http_only 则是让 Cookie 无法通过 JavaScript 读取,也就是 document.cookie 无法读取 Cookie 。为什么要有这两个操作呢?

HTTPS 在传输过程中是安全的,也就是说,在传输的过程中,数据是加密的,双方的证书都存在且匹配的情况下它们才会正确地编解码。这就避免了在数据传输过程中的窃取问题的发生。而不让 JavaScript 读取则是应对 XSS 攻击的有效方式,不管是存储型、反射型的 XSS ,核心特点都是在注入成功之后通过窃取 Cookie 来拿到当前帐号的登录权限。通过限制 JS 读取之后,也就无法拿到 Cookie 里面的内容,自然也不会泄露 session id 了。

除此之外,域信息、路径信息这些 Cookie 中的设置属性也最好都考虑应用上,对于跨域跨站的攻击都是有帮助的。

重新生成 session id

除了 Cookie 相关的设置外,每次请求或者说间隔一段时间就重新生成一个 session id 也是一种不错的安全保障机制。也就是说,利用我们上篇文章中学习到的 session_create_id() 或 session_regenerate_id() 这两个函数,在每次请求之后都调用一下,这样都会重新生成一个新的会话ID。就算其他人拿到了之前的 session id ,放到新的请求中也会失效。不过这个操作会有一定的垃圾成本,也就是会产生很多空的 session 文件或者数据。在上篇文章的演示中我们也看到过,重新生成 session id 之后,原来的文件或者数据项还存在,虽说里面是空的了,但还是会占用一定的空间。

注意,在使用 session_regenerate_id(); 时,要设置它的参数为 true ,也就是 session_regenerate_id(true); 这样,这个参数的意思就是删除老的 session id 内容。否则老的 session id 还是可以访问到数据的。

同理,现在很多网站会做自动登录,对于每次登录之后,最好是刷新你的 Token 或者是 session id ,而且过一段时间也要让用户重新登录一次。毕竟这些登录信息也是保存在客户端的 Cookie 中的。除了相关的 Cookie 安全设置之外,还要根据用户的登录环境比如 IP 地址、浏览器的变化来及时地让自动登录失效,保证用户的帐号安全。另外,注意要让 Cookie 和 SESSION 的过期时间保持一致,让它们一起过期。

安全选项配置

在 php.ini 中,有一个 session.use_strict_mode 选项,在默认情况下它是关闭的。如果开启它的话,就可以让会话模块禁止使用未初始化的 session id 。也就是说,它只接受由当前系统自己创建的有效的 session id ,而拒绝由用户自己提供的 session id 。

攻击者可以自行设置 Cookie 或者使用 JS 注入的方式来设置 session id 并进行会话攻击。启用 session.use_strict_mode 之后,可以阻止未经模块初始化的 session id 的执行。

上面说的是什么意思呢?比如我们传递一个不是由我们系统生成的 session id 。然后系统并没有严格地验证用户登录情况,而是以这个 session id 进行新的初始化并附上一些数据的话,那么这个攻击就成功了。

另外,如果确定我们当前的页面只是读取,比如说非登录页面。那么我们可以为当前的会话设置一个 read_and_close 属性,会话文件在读取完成之后会马上关闭。

session_start(['read_and_close'=>true]);

CSRF

对于 SESSION 来说,CSRF 是无法防范的,但在 PHP7.3 之后增加了 Cookie 中的 SameSite 设置,也就是同源站点信息的设置,可以有效地防范此类攻击。当然,对于 CSRF 更方便地还是增加随机 Token 来验证,这个功能各类框架都已经提供了,这里也就不在多说了。

核心重点功能的重验证

最后,我们再来说一个问题。大家在使用很多应用的时候都会发现一个问题,特别是在涉及金钱交易的时候,都会让我们每次都输入一个交易密码。这其实是通过业务的手段来保证安全的一种形式。也不一定是完全的在涉及到金钱交易的时候才应用,比如我们后台如果检测到了用户登录的异常,IP 地址变化、浏览器网络环境的变化,那么即使他登录成功了,也只能做一些常规性的操作,而在重要的操作时,比如发表新的文章、查看核心的数据、删除用户或数据、修改数据的时候,重新进行一次简单的密码验证,也能够有效地对我们的系统用户安全进行保障。

总结

对于 SESSION 的安全来说,Cookie 其实才是最重要的一环。对于这点来说相信大家不会有异议。要说最核心的问题那只能说是 HTTP 是无状态的,实在是没有别的方法能够在不同的页面之间共享数据。Cookie 配合 SESSION 这种方式是最经济实惠而且也是最方便的一种方案。只要做好了相应的防护,基本上在我们的日常开发中还是不会有太大的问题的。安全从来都没有绝对一说,只有相对的安全。即使是大如阿里、腾讯之类的公司,也无时无刻的不在应对各种网络攻击威胁。不断地提升自己,学习各类安全防范知识才是我们进一步提升的关键。

参考文档:

https://www.php.net/manual/zh/features.session.security.management.php

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/30391.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法基础精选题单 动态规划(dp)(递推+线性dp)(个人题解)

前言&#xff1a; 一些简单的dp问题。 正文&#xff1a; 题单&#xff1a;237题】算法基础精选题单_ACM竞赛_ACM/CSP/ICPC/CCPC/比赛经验/题解/资讯_牛客竞赛OJ_牛客网 (nowcoder.com) 递推&#xff1a; NC235911 走楼梯&#xff1a; #include<bits/stdc.h> using na…

在k8s上部署一个简单的应用

部署一个简单的应用 实验目标&#xff1a; 部署一个简单的 web 应用&#xff0c;比如 Nginx 或者一个自定义的 Node.js 应用。 实验步骤&#xff1a; 创建一个 Deployment。创建一个 Service 来暴露应用。验证应用是否可以通过 Service 访问。 今天我们来做一下昨天分享的可…

Debian12的#!bash #!/bin/bash #!/bin/env bash #!/usr/bin/bash #!/usr/bin/env bash

bash脚本开头可写成 #!/bin/bash , #!/bin/env bash , #!/usr/bin/bash , #!/usr/bin/env bash #!/bin/bash , #!/usr/bin/bash#!/bin/env bash , #!/usr/bin/env bash Debian12的 /bin 是 /usr/bin 的软链接, /sbin 是 /usr/sbin 的软链接, (Debian12默认没有ll命令,用的ls …

Python的pandas读取excel文件中的数据

一、前言 hello呀&#xff01;各位铁子们大家好呀&#xff0c;我是一个在软件测试行业摸爬滚打十几年的老江湖了&#xff0c;今天呢来和大家聊一聊用Python的pandas读取excel文件中的数据。 二、读取Excel文件 使用pandas的read_excel()方法&#xff0c;可通过文件路径直接读…

AI音乐时代的挑战与机遇

近期&#xff0c;音乐领域迎来了一波AI大模型的上线潮&#xff0c;这些模型极大地降低了素人生产音乐的门槛&#xff0c;引发了关于音乐圈是否会被AI彻底颠覆的热烈讨论。虽然这一现象带来了短暂的兴奋&#xff0c;但同时也引发了一系列问题&#xff0c;如AI音乐产品的版权归属…

Techviz:XR协作工作流程,重塑远程电话会议新形式

在当今快速发展的数字环境中&#xff0c;无缝远程协作的需求正在成为企业多部门协同工作的重中之重&#xff0c;尤其是对于制造业、建筑和设计等行业的专业人士而言&#xff0c;这一需求更加迫切。传统的远程电话会议协作形式存在着延滞性&#xff0c;已经渐渐跟不上当今快节奏…

动态更新自建的Redis连接池连接数量

/*** 定时更新Redis连接池信息&#xff0c;防止资源让费*/private static final ScheduledThreadPoolExecutor DYNAMICALLY_UPDATE_REDIS_POOL_THREAD new ScheduledThreadPoolExecutor(1, new ThreadFactory() {Overridepublic Thread newThread(Runnable r) {Thread thread …

项目三OpenStack基础环境配置与API使用

任务一 了解OpenStack基础环境配置 1.1 •数据库服务器 1.2 •消息队列服务 •AMQP系统的组成 任务二 了解并使用OpenStack API 2.1 •什么是RESTful API • RESTful API 是目前比较成熟的 一套Internet应用程序的API软件架构 。 • 表现 层&#xff08; Representation …

汽车IVI中控开发入门及进阶(三十一):视频知识扫盲

有效的视频资源管理需要集成许多不同的底层技术,共同为用户提供给定应用程序的最佳体验。其中许多技术是从早期电视广播中使用的技术演变而来的。其他方法,如用于通过网络流式传输视频的压缩方法,相对较新且不断发展。 以下详细概述了与图形和视频处理和传输相关的一些基本…

云上宝库:三大厂商对象存储安全性及差异性比较

前言 看了几家云厂商的对象存储&#xff0c;使用上有相似也有差异&#xff0c;聊聊阿里云、腾讯云、京东云三家对象存储在使用中存在的风险以及防护措施。 0x01 云存储命名 阿里云对象存储OSS(Object Storage Service)&#xff0c;新用户免费试用三个月&#xff0c;存储包容…

安装idea后配置的全局配置

1、打开IDEA应用&#xff1a;Customize→All settings...&#xff0c;如果启动IDEA后&#xff0c;默认打开的是之前的项目&#xff0c;可以关闭当前项目&#xff1a;File→Close Project&#xff0c;就退到全局配置界面了。 2、打开全局配置界面&#xff1a;Editor→File Encod…

FreeRTOS(一)

一.汇编指令 读内存&#xff1a;Load LDR RO&#xff0c;[R1&#xff0c;#4];读地址"R14"&#xff0c;得到的4字节数据存入RO 写内存&#xff1a;Store STR RO&#xff0c;[R1&#xff0c;#4]:把R0的4字节数据写入地址"R14" 加减 ADD RO.R1&#xff0c;R2R…

torch.topk用法

torch.topk用法 介绍使用示例 介绍 官网介绍&#xff1a;https://pytorch.org/docs/stable/generated/torch.topk.html 在指定维度选取k个最大&#xff08;最小&#xff09;的值。 使用示例 values torch.tensor([[2, 1, 3], [1, 2, 3]]) # values # tensor([[2, 1, 3], #…

项目拆分 多模块原则

多模块拆分的必要性 使用Java技术开发的工程项目&#xff0c;无论是数据处理系统还是Web网站&#xff0c;随着项目的不断发展&#xff0c;需求的不断细化与添加&#xff0c;工程项目中的代码越来越多&#xff0c;包结构也越来越复杂这时候工程的进展就会遇到各种问题&#xff…

斯巴达(Spartanhost)VPS的性能评测

原创原文链接&#xff1a;详细斯巴达&#xff08;Spartanhost&#xff09;VPS的性能和购买价值评测 | BOBO Blog (soulcloser.com)https://www.soulcloser.com/3398/ 引言 最近看了全球的VPS商家&#xff0c;想搞台网站高性能的服务器&#xff0c;发现一个特别有意思的商家竟…

Mathtype7永久无限免费安装包下载地址2024最新方法步骤

亲爱的数学爱好者们&#xff0c;今天我要分享一个让数学表达变得超级简单的神器——Mathtype7最新破解版&#xff01;&#x1f389; 这不仅仅是个软件&#xff0c;而是打开高效学习和工作的钥匙。准备好了吗&#xff1f;让我们一起探索这个神奇的工具&#xff01; MathType最新…

通过ModelScope开源Embedding模型将图片转换为向量

本文介绍如何通过ModelScope魔搭社区中的视觉表征模型将图片转换为向量&#xff0c;并入库至向量检索服务DashVector中进行向量检索。 ModelScope魔搭社区旨在打造下一代开源的模型即服务共享平台&#xff0c;为泛AI开发者提供灵活、易用、低成本的一站式模型服务产品&#xf…

空间复杂度的相关概念

1. 空间复杂度 空间复杂度&#xff08;space complexity&#xff09;用于衡量算法占用内存空间随着数据量变大时的增长趋势。 统计哪些空间&#xff1a; ● 暂存数据&#xff1a;用于保存算法运行过程中的各种常量、变量、对象等。 ● 栈帧空间&#xff1a;用于保存调用函数…

火山引擎字节跳动豆包AI绘画接口

import base64 import os.pathfrom volcengine.visual.VisualService import VisualServicedef paint_dance(desc):visual_service VisualService()visual_service.set_ak(你的AK)visual_service.set_sk(你的SK)# 高美感通用V1.3-文生图form {"req_key": "hig…

鸿蒙HarmonyOS $r(““)与$rawfile(““)的区别

在鸿蒙&#xff08;HarmonyOS&#xff09;开发中&#xff0c;$r(“”) 和 $rawfile(“”) 是两种不同的资源引用方式&#xff0c;它们分别用于引用不同的资源类型。 1、$r(“”) $r 函数通常用于引用字符串、颜色、尺寸、样式等定义在资源文件&#xff08;如 strings.json, c…