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

 更新时间:2017年10月20日 09:12:42   作者:mortimer_c  
这篇文章主要介绍了详解cookie验证的php应用的一种SSO解决办法的相关资料,希望通过本文能帮助到大家让大家遇到这种类似问题解决,需要的朋友可以参考下

详解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+ajax实现的点击浏览量加1

    php+ajax实现的点击浏览量加1

    本文给大家分享的是一段非常实用的php+ajax实现的点击浏览量加1的代码,推荐给大家,有需要的小伙伴可以参考下
    2015-04-04
  • PHP门面模式实现简单的邮件发送示例

    PHP门面模式实现简单的邮件发送示例

    这篇文章主要为大家介绍了PHP门面模式实现简单的邮件发送示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • PHP中使用循环实现的金字塔图形

    PHP中使用循环实现的金字塔图形

    这篇文章主要介绍了PHP中使用循环实现的金字塔图形,本文是一篇PHP的课堂笔记,完成老师的作业总结而来,需要的朋友可以参考下
    2014-11-11
  • php7性能提升的原因详解

    php7性能提升的原因详解

    在本篇文章里小编给大家分享是的关于php7性能提升的原因以及相关知识点,有需要的朋友们参考下。
    2019-10-10
  • 探讨Hessian在PHP中的使用分析

    探讨Hessian在PHP中的使用分析

    本篇文章是对Hessian在PHP中的使用进行了详细的分析介绍, 需要的朋友参考下
    2013-06-06
  • php递归json类实例

    php递归json类实例

    这篇文章主要介绍了php递归json类的实现方法,可以实现对索引数组及数字数组的解析,进而实现递归数组返回json字符串的功能,需要的朋友可以参考下
    2014-12-12
  • PHP正则匹配操作简单示例【preg_match_all应用】

    PHP正则匹配操作简单示例【preg_match_all应用】

    这篇文章主要介绍了PHP正则匹配操作,结合简单实例形式分析了php中preg_match_all针对HTML标签中P元素及img src元素内容的获取技巧,需要的朋友可以参考下
    2017-07-07
  • PHP里的中文变量说明

    PHP里的中文变量说明

    一般在我们概念里变量都应该是有字母,数字,下划线组成,可在PHP下中文也可以作为变量的一部分,今天就要讲讲PHP的变量
    2011-07-07
  • 老生常谈php 正则中的i,m,s,x,e分别表示什么

    老生常谈php 正则中的i,m,s,x,e分别表示什么

    下面小编就为大家带来一篇老生常谈php 正则中的i,m,s,x,e分别表示什么。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • 两种设置php载入页面时编码的方法

    两种设置php载入页面时编码的方法

    设置php页面编码的方法有两种,一是输出meta标签,二是使用header函数,下面为大家详细介绍下
    2014-07-07

最新评论