当前位置: 首页 > news >正文

yii2中session跨域名的问题

关闭httponly引起的问题

场景1

测试A:咦,为什么test环境登录不了呢?

程序员:清缓存。

测试B:握草,dev也登录不了。。。谁看看!

程序员:清缓存。

测试们:。。。唉

场景2

程序员A:我靠,TNND,真的登录不了,怎么回事?

程序员B:可能还是要请缓存。

程序员A:没用。

程序员B:我看看吧。

一阵捣鼓后,呀,cookie中怎么会有两个sessionID呢?

这件事情的起因是这样的,前端工程师需要拿取后台管理员的cookie,用牛叉的控制台就可以看到:document.cookie,结果没有取到,再看看cookie管理器,显示是httponly为true,即开启了path=/;httponly,这个是yii2防止XSS攻击所设置的。

但是,前端工程师需要这个cookie信息,所以配置中开启了session的cookieParams参数。

'session' => [
    'class' => 'yii\redis\Session',
    'redis' => 'redis3',
    'name' => 'SID',
    'useCookies' => true,
    'cookieParams' => [
        'domain' => '.xxx.com',
        'httpOnly' => false,
    ],
],

这样就可以获取到cookie中保存的sessionID了,感觉没有任何问题。

可是,我们的域名有:admin-test.xxx.com,admin-dev.xxx.com,admin.xxx.com,这三个域名仅仅是不同的环境,因此,yii2的跨域名访问就引出来了。

那么上面问题如何解决呢?很简单,domain这个参数默认是当前的域名,如果只允许当前域名登录访问,使用默认即可。

'session' => [
    'class' => 'yii\redis\Session',
    'redis' => 'redis3',
    'name' => 'SID',
    'useCookies' => true,
    'cookieParams' => [
        'httpOnly' => false,
    ],
],

看到网上大致有很多这样的做法:

'user' => [
    'class' => '\backend\extensions\Admin',
    'identityClass' => '\backend\models\Admin',
    'enableAutoLogin' => false,
    'enableSession' => true,
    'loginUrl' => ['admin/login'],
    'identityCookie' => ['httpOnly' => false, 'domain' => '.xxx.com'],
],

也就是把用户的cookie中的httphttponly关闭,并且指定具体的域名,最燃这样做了,但还是不能关闭客户端的cookie的httponly,依然获取不到cookie的值,建议这里的httponly一定为true。

附加:处理session跨域几种的方案

前面谈过session相关配置,在开发的时候,常需要跨域共用session的是登录模块,我相信很多开发的朋友的都遇到过,只需要一个地方登录,相关联的网站也是处于登录状态。两种情况:一种9streets.cn和a.9streets.cn之间,另一种是a.com b.com之间,这几天总结了一下处理方法。

无论是一二级域名,和不同域名下的跨域,无非要达到两点:

客户端访问同一个sessionId,所有域名对应的服务器访问的session的数据的位置必须一致。

  • 1.访问共同的sessionId主要是通过把当前的sessionId写进cookie里面cookie在不同域名下是不能访问的,我们需要在访问在后台设置用户在登录的时候,把需要共用的登录信息的域名,如果是在1,2级域名下,直接把cookie设置为所属主域名,例如:

setcookie("session_id",session_id(),time()+3600*24*365*10,"/",".a.com"); 

也许你会问:如果是在不同的域名呢?采用P3P技术简单解决,实现原理,在访问网站x.com的时候,y.com程序触发y.com文件的写入sessionid值,sessionid值便可以获取,然后把seesion值存入数据库,取相同的sessionid值便可。这就要求y.com里面的程序文件必需能跨域访问,默认情况下,浏览器是不能跨域设置cookie的,加上p3p头后才行。在对应php文件加上:header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');

  • 2.session数据存储位置一致的实现方法

session该数据默认情况下是存放在服务器的tmp文件下的,是以文件形式存在,而非存储在服务器的内存中,在这里我们得修改为所有域下都能访问的方式。网上介绍了数据库存储,文件形式存储,内存存储, 如果用数据库存储session数据,网站的访问量很大的话,SESSION 的读写会频繁地对数据库进行操作,效率就会明显降低,可以考虑存在内存服务器来实现,下面的session.rar里面介绍的是数据库存session的实例。

yii2中如何实现呢?

main.php中应该这般配置(同一套环境不会出现前面所说的问题,但是不同环境还会出现):

'user' => [
    'class' => '\backend\extensions\Admin',
    'identityClass' => '\backend\models\Admin',
    'enableAutoLogin' => false,
    'enableSession' => true,
    'loginUrl' => ['admin/login'],
    'identityCookie' => ['name' => '_identity', 'httpOnly' => true, 'domain' => '.xxx.com'],
],
'session' => [
    'class' => 'yii\redis\Session',
    'redis' => 'redis3',
    'name' => 'SID',
    'useCookies' => true,
    'cookieParams' => [
        'httpOnly' => false,
        'domain' => '.xxx.com', 'lifetime' => 0
    ],
],

相关文章:

  • MVC,MVP,MVVM
  • android设备分辨率及sp、px计算
  • mysql information_schema介绍
  • js == 与 ===
  • 基于MODBUS 协议的CRC16程序实现
  • python中的logging模块的使用
  • NLPIR大数据挖掘平台新增敏感词扫描功能
  • 面试(二)
  • 第六课、窗口组件及窗口类型------------------狄泰软件学院
  • Git:常用操作
  • Xen server虚拟化中虚拟机磁盘文件丢失的处理办法
  • C语言截取字符串或反转字符串
  • 彻底搞定C指针-函数名与函数指针【转】
  • Spark上的深度学习框架再添新兵:Yahoo开源TensorFlowOnSpark
  • CSS小知识点-1
  • 收藏网友的 源程序下载网
  • C# 免费离线人脸识别 2.0 Demo
  • Kibana配置logstash,报表一体化
  • Netty 4.1 源代码学习:线程模型
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • swift基础之_对象 实例方法 对象方法。
  • 初识 webpack
  • 技术发展面试
  • 开发基于以太坊智能合约的DApp
  • 力扣(LeetCode)56
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 排序算法学习笔记
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 微信小程序:实现悬浮返回和分享按钮
  • 我从编程教室毕业
  • 一天一个设计模式之JS实现——适配器模式
  • 智能合约Solidity教程-事件和日志(一)
  • MPAndroidChart 教程:Y轴 YAxis
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • ​queue --- 一个同步的队列类​
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (6)STL算法之转换
  • (编译到47%失败)to be deleted
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (力扣)1314.矩阵区域和
  • (六)vue-router+UI组件库
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (强烈推荐)移动端音视频从零到上手(下)
  • (转) ns2/nam与nam实现相关的文件
  • (转)h264中avc和flv数据的解析
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • .net CHARTING图表控件下载地址
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .NET 反射的使用
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken
  • .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示
  • /usr/local/nginx/logs/nginx.pid failed (2: No such file or directory)