详解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文件,搞定!

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

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

(0)

相关推荐

  • PHP中SSO Cookie登录分析和实现

    什么是SSO? 单点登录SSO(Single Sign-On)是身份管理中的一部分.SSO的一种较为通俗的定义是:SSO是指访问同一服务器不同应用中的受保护资源的同一用户,只需要登录一次,即通过一个应用中的安全验证后,再访问其他应用中的受保护资源时,不再需要重新登录验证 SSO的用途: 目前的企业应用环境中,往往有很多的应用系统,淘宝.天猫.爱淘宝等等产品和如办公自动化(OA)系统,财务管理系统,档案管理系统,信息查询系统等等.这些应用系统服务于企业的信息化建设,为企业带来了很好的效益.但是,用

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

    详解cookie验证的php应用的一种SSO解决办法 近日,项目中需要接入一个"年久失修"的PHP应用,由于系统已经建设多年,并且是信息中心自己的人通过某些工具弄出来的,而且是本人未真正接触过的PHP写的,而且跟我们的系统不在同一服务器上也就是存在跨域的问题,想通过客户端模拟登录的方式来实现,但是总是不成功. 没办法,只好想尽一切办法查看页面源代码,然后,找服务器的php文件,分析. 由于对php不熟悉,加上没有仔细看,因此,对于找到的登录页面的php文件,一开始只是有一个初步的了解,

  • 详解React-Router中Url参数改变页面不刷新的解决办法

    问题 今天在写页面的时候发现一个问题,就是在React Router中使用了Url传参的功能,像这样: export class MainRouter extends React.Component { render() { return ( <BrowserRouter> <Switch> ... <Route exact path={'/channel/:channelId'} component={ChannelPerPage}/> ... </Switch

  • 详解docker中使用systemctl启动服务报错的解决办法

    docker版本: [root@localhost gae_proxy]# docker version Client: Version: 1.10.3 API version: 1.22 Package version: docker-common-1.10.3-46.el7.centos.10.x86_64 Go version: go1.6.3 Git commit: d381c64-unsupported Built: Thu Aug 4 13:21:17 2016 OS/Arch: l

  • 详解spring中aop不生效的几种解决办法

    先看下这个问题的背景:假设有一个spring应用,开发人员希望自定义一个注解@Log,可以加到指定的方法上,实现自动记录日志(入参.出参.响应耗时这些) package com.cnblogs.yjmyzz.springbootdemo.aspect; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy

  • 详解MyBatis-Plus updateById方法更新不了空字符串/null解决方法

    最近遇到了Mybatis-Plus updateById(),更新某一个字段为null,却发现没有更新成功,发现有一个博客记录挺好的.转载过来,方便自己看. 一.简介 因为最近在忙项目,好久都没有更新博客,最近在项目中刚好遇到一个问题,就是在使用MyBatis-Plus updateById(xxx)的时候,居然更新不了字符串或者null,本文分享两种解决方案,具体大家可以根据自己的需求选择一种方法解决. 二.原理 在实际项目中,难免更新的时候,有可能会把已有的值更新成空字符串或者null,但是

  • 详解win7 cmd执行vue不是内部命令的解决方法

    详解win7 cmd执行vue不是内部命令的解决方法 通过全局安装vue-cli npm install --global vue-cli 在cmd中运行vue提示不是内部命令,原因是环境变量没有加上 找到npm的位置:(不在这个位置的全局搜索vue.cmd即可) C:\Users\Administrator\AppData\Roaming\npm 打开我的电脑-->右键属性-->高级系统设置-->环境变量-->Path-->添加获得npm的位置,保存,重启cmd命令工具即可

  • 详解Java中数组判断元素存在几种方式比较

    1. 通过将数组转换成List,然后使用List中的contains进行判断其是否存在 public static boolean useList(String[] arr,String containValue){ return Arrays.asList(arr).contains(containValue); } 需要注意的是Arrays.asList这个方法中转换的List并不是java.util.ArrayList而是java.util.Arrays.ArrayList,其中java.

  • 详解Android中PopupWindow在7.0后适配的解决

    本文介绍了详解Android中PopupWindow在7.0后适配的解决,分享给大家,具体如下: 这里主要记录一次踩坑的经历. 需求:如上图左侧效果,想在按钮的下方弹一个PopupWindow.嗯,很简单一个效果,然当适配7.0后发现这个PopupWindow显示异常,然后网上找到了下面这种方案. 7.0适配方案(但7.1又复现了) // 将popupWindow显示在anchor下方 public void showAsDropDown(PopupWindow popupWindow, Vie

  • 详解Python列表赋值复制深拷贝及5种浅拷贝

    概述 在列表复制这个问题,看似简单的复制却有着许多的学问,尤其是对新手来说,理所当然的事情却并不如意,比如列表的赋值.复制.浅拷贝.深拷贝等绕口的名词到底有什么区别和作用呢? 列表赋值 # 定义一个新列表 l1 = [1, 2, 3, 4, 5] # 对l2赋值 l2 = l1 print(l1) l2[0] = 100 print(l1) 示例结果: [1, 2, 3, 4, 5] [100, 2, 3, 4, 5] 可以看到,更改赋值后的L2后L1同样也会被更改,看似简单的"复制"

  • 详解Python修复遥感影像条带的两种方式

    GDAL修复Landsat ETM+影像条带 Landsat7 ETM+卫星影像由于卫星传感器故障,导致此后获取的影像出现了条带.如下图所示, 影像中均匀的布满条带. 使用GDAL修复影像条带的代码如下: def gdal_repair(tif_name, out_name, bands): """ tif_name(string): 源影像名 out_name(string): 输出影像名 bands(integer): 影像波段数 """ #

随机推荐