详解cookie验证的php应用的一种SSO解决办法


Posted in PHP onOctober 20, 2017

详解cookie验证的php应用的一种SSO解决办法

近日,项目中需要接入一个“年久失修”的PHP应用,由于系统已经建设多年,并且是信息中心自己的人通过某些工具弄出来的,而且是本人未真正接触过的PHP写的,而且跟我们的系统不在同一服务器上也就是存在跨域的问题,想通过客户端模拟登录的方式来实现,但是总是不成功。

没办法,只好想尽一切办法查看页面源代码,然后,找服务器的php文件,分析。

由于对php不熟悉,加上没有仔细看,因此,对于找到的登录页面的php文件,一开始只是有一个初步的了解,基本上确定是通过cookie来实现,实际上真正的验证机制还有如何验证都没有了解清楚,急着就开始新的征程,结果屡试屡败。
先说一下一开始的实现方式:

最开始

系统中添加一个iframe,试图从本地应用中给iframe中的远程系统的指定页面的用户名、密码赋值,并模拟“登录”按钮的单击事件。这个是必定失败的,因为,跨域了,js一般不能跨域远程操作别人的东西。

然后

本地form的远程action。在本地的页面中新增一个form,此form中添加上与目标系统一样的登录界面的内容(就是用户名、密码输入框,特别说明的是此应用尚没有验证码),然后在页面加载时,便给form中的元素赋值,点击本地页面的“单点登录”时,提交此form,试图按照java登录验证的模式来实现此php系统的登录验证。但是,依然,无法正常登录。

接下来

仔细分析登录的php文件。发现验证过程其实是通过cookie来实现的,依稀记得早期的很多BBS都是这种方式。找相关人员通过各种途径,大体了解了登录验证的机制及过程,原来是在登录之后,将信息写入cookie,每个页面都会引入一个通过读取cookie并根据cookie的内容进行判断的php文件。这样了解了验证机制。于是,想要通过跨域写cookie的方式来实现,由于本身的应用是portal应用,因此,写跨域应用也费了一些劲,最终,写本地cookie没问题,但是跨域的cookie,连想都不用想,生成不了。

最后

分析php的登录界面,发现之所以每次定向的登录php文件,在进行验证的时候,都有一个if(isset($submit) and $submit=="登录")这样的判断,不是特别明白这句是什么意思,isset貌似是判断参数是否为空,而后面则判断参数值为“登录”!由于本人php水平太低,不知道这样的判断有何作用,是否能够执行。最终,只能跟客户讨论是否可以通过在服务端新增一个专门用于接收单点登录需要的php文件。只是把原来的登录用的php文件做了修改,去掉这些判断,并且原来的登录在验证之后,跳转到的目标页面是通过从地址栏获取的信息来进行跳转的,因此,对此部分内容也进行了调增。这样,最终形成了以下的ssologon.php文件

<?php require($DOCUMENT_ROOT."/db.inc"); 
 
    $dbh=db_connect(); 
    if(!$dbh) die("mysql connect failed. please wait to retry..."); 
    $sql="select * from user_code where ((user_name='$username') and (user_password='$password'))";            
    $result=mysql_query($sql,$dbh); 
    if(!$result) die("mysql system error, please connact with admin"); 
    $num=mysql_num_rows($result);       
    if($num<1){ //not such a man 
      db_close($dbh); 
      echo "$header 姓名或者密码错误 $footer"; 
      exit;   
    } 
    else{ //验证通过,设置cookie 
      $row=mysql_fetch_object($result); 
      db_close($dbh); 
      $temp=$row->user_id."*".$row->user_cnname."*".$row->user_password;            
      $ret=setcookie("WEBOAUSER","$temp"); 
      echo "<meta http-equiv='refresh' content='0;url=http://192.168.1.4/uuu/default.php'>"; 
       
      exit;                 
    } 
?>

然后,把本地应用中的form的action指定为此php文件,搞定!

总结,对于需要分析别人的东西才能搞定的事情,一定不能过于焦躁,要仔细,了解原理,才能事半功倍。

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

PHP 相关文章推荐
第四节--构造函数和析构函数
Nov 16 PHP
如何批量替换相对地址为绝对地址(利用bat批处理实现)
May 27 PHP
解析php如何将日志写进syslog
Jun 28 PHP
php基本函数汇总
Jul 09 PHP
php根据生日计算年龄的方法
Jul 13 PHP
使用PHP生成图片的缩略图的方法
Aug 18 PHP
详解WordPress中分类函数wp_list_categories的使用
Jan 04 PHP
php 开发中加密的几种方法总结
Mar 22 PHP
Yii 2.0自带的验证码使用经验分享
Jun 19 PHP
Laravel框架路由和控制器的绑定操作方法
Jun 12 PHP
PHP让网站移动访问更加友好方法
Feb 14 PHP
thinkphp3.2同时连接两个数据库的简单方法
Aug 13 PHP
thinkPHP5项目中实现QQ第三方登录功能
Oct 20 #PHP
PHP简单实现二维数组赋值与遍历功能示例
Oct 19 #PHP
phpStudy2016 配置多个域名期间遇到的问题小结
Oct 19 #PHP
phpStudy配置多站点多域名方法及遇到的403错误解决方法
Oct 19 #PHP
PHP自定义函数实现数组比较功能示例
Oct 19 #PHP
phpstudy的php版本自由修改的方法
Oct 18 #PHP
phpStudy 2016 使用教程详解(支持PHP7)
Oct 18 #PHP
You might like
社区(php&amp;&amp;mysql)二
2006/10/09 PHP
CI(CodeIgniter)框架配置
2014/06/10 PHP
javascript:void(0)的作用示例介绍
2013/10/28 Javascript
三种方式获取XMLHttpRequest对象
2014/04/21 Javascript
JavaScript中双叹号!!作用示例介绍
2014/09/21 Javascript
jQuery中toggle()函数的使用实例
2015/04/17 Javascript
使用Chrome浏览器调试AngularJS应用的方法
2015/06/18 Javascript
JS上传图片预览插件制作(兼容到IE6)
2016/08/07 Javascript
javascript基本数据类型和转换
2017/03/17 Javascript
Vue.js实现输入框绑定的实例代码
2017/08/24 Javascript
详解javascript设计模式三:代理模式
2019/03/25 Javascript
Vue中keep-alive组件的深入理解
2020/08/23 Javascript
vue 判断页面是首次进入还是再次刷新的实例
2020/11/05 Javascript
快速解决vue2+vue-cli3项目ie兼容的问题
2020/11/17 Vue.js
JQuery绑定事件四种实现方法解析
2020/12/02 jQuery
javascript实现数字时钟效果
2021/02/06 Javascript
js闭包和垃圾回收机制示例详解
2021/03/01 Javascript
[03:42]2014DOTA2西雅图国际邀请赛7月9日TOPPLAY
2014/07/09 DOTA
二种python发送邮件实例讲解(python发邮件附件可以使用email模块实现)
2013/12/03 Python
python通过yield实现数组全排列的方法
2015/03/18 Python
python安装mysql-python简明笔记(ubuntu环境)
2016/06/25 Python
利用Python实现颜色色值转换的小工具
2016/10/27 Python
Pytorch入门之mnist分类实例
2018/04/14 Python
python dict 相同key 合并value的实例
2019/01/21 Python
从0到1使用python开发一个半自动答题小程序的实现
2020/05/12 Python
新手常见Python错误及异常解决处理方案
2020/06/18 Python
吃透移动端 Html5 响应式布局
2019/12/16 HTML / CSS
世界上最好的儿童品牌:AlexandAlexa
2018/01/27 全球购物
西班牙床垫网上商店:Colchones.es
2018/05/06 全球购物
Harrods美国:英国最大的百货公司
2018/11/04 全球购物
Beach Bunny Swimwear官网:设计师泳装和性感比基尼
2019/03/13 全球购物
官方授权图形T恤和服装:Fifth Sun
2019/06/12 全球购物
什么是事务?为什么需要事务?
2012/01/09 面试题
施工人员岗位职责
2013/12/12 职场文书
2016年第二十五次全国助残日活动总结
2016/04/01 职场文书
vue+elementUI实现表格列的显示与隐藏
2022/04/13 Vue.js