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

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

近日,项目中需要接入一个“年久失修”的,由于系统已经建设多年,并且是信息中心自己的人通过某些工具弄出来的,而且是本人未真正接触过的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文件

rush:PHP;"> PHP require($DOCUMENT_ROOT."/db.inc");
$dbh=db_connect(); 
if(!$dbh) die("<a href="https://www.jb51.cc/tag/MysqL/" target="_blank" class="keywords">MysqL</a> connect <a href="https://www.jb51.cc/tag/Failed/" target="_blank" class="keywords">Failed</a>. please wait to retry..."); 
$<a href="https://www.jb51.cc/tag/sql/" target="_blank" class="keywords">sql</a>="select * from user_code where ((user_name='$username') and (user_password='$password'))";            
$result=<a href="https://www.jb51.cc/tag/MysqL/" target="_blank" class="keywords">MysqL</a>_query($<a href="https://www.jb51.cc/tag/sql/" target="_blank" class="keywords">sql</a>,$dbh); 
if(!$result) die("<a href="https://www.jb51.cc/tag/MysqL/" target="_blank" class="keywords">MysqL</a> sy<a href="https://www.jb51.cc/tag/stem/" target="_blank" class="keywords">stem</a> error,please connact with admin"); 
$num=<a href="https://www.jb51.cc/tag/MysqL/" target="_blank" class="keywords">MysqL</a>_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文件,搞定!

总结

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


服务器优化必备:深入了解PHP8底层开发原理
Golang的网络编程:如何快速构建高性能的网络应用?
Golang和其他编程语言的对比:为什么它的开发效率更高?
PHP8底层开发原理揭秘:如何利用新特性创建出色的Web应用
将字符重新排列以形成回文(如果可能)在C++中
掌握PHP8底层开发原理和新特性:创建高效可扩展的应用程序
服务器性能优化必学:掌握PHP8底层开发原理
PHP8新特性和底层开发原理详解:优化应用性能的终极指南
将 C/C++ 代码转换为汇编语言
深入研究PHP8底层开发原理:创建高效可扩展的应用程序
C++程序查找法向量和迹
PHP8底层开发原理实战指南:提升服务器效能
重排数组,使得当 i 为偶数时,arr[i] >= arr[j],当 i 为奇数时,arr[i] <= arr[j],其中 j < i,使用 C++ 语言实现
Golang的垃圾回收:为什么它可以减少开发人员的负担?
C++程序:将一个数组的所有元素复制到另一个数组中
Golang:构建智能系统的基石
为什么AI开发者应该关注Golang?
在C和C++中,逗号(comma)的用法是用来分隔表达式或语句
PHP8底层开发原理解析及新特性应用实例
利用PHP8底层开发原理解析新特性:如何构建出色的Web应用