相關(guān)關(guān)鍵詞
關(guān)于我們
最新文章
- PHP中opcode緩存簡(jiǎn)單用法分析
- thinkPHP控制器變量在模板中的顯示方法示例
- PHP move_uploaded_file() 函數(shù)(將上傳的文件移動(dòng)到新位置)
- dirname(__FILE__)的含義和應(yīng)用說明
- thinkPHP5框架實(shí)現(xiàn)分頁查詢功能的方法示例
- PHP中單雙號(hào)與變量
- PHP獲得當(dāng)日零點(diǎn)時(shí)間戳的方法分析
- Laravel ORM對(duì)Model::find方法進(jìn)行緩存示例詳解
- PHP讀寫文件高并發(fā)處理操作實(shí)例詳解
- 【CLI】利用Curl下載文件實(shí)時(shí)進(jìn)度條顯示的實(shí)現(xiàn)
詳解cookie驗(yàn)證的php應(yīng)用的一種SSO解決辦法
詳解cookie驗(yàn)證的php應(yīng)用的一種SSO解決辦法
近日,項(xiàng)目中需要接入一個(gè)“年久失修”的PHP應(yīng)用,由于系統(tǒng)已經(jīng)建設(shè)多年,并且是信息中心自己的人通過某些工具弄出來的,而且是本人未真正接觸過的PHP寫的,而且跟我們的系統(tǒng)不在同一服務(wù)器上也就是存在跨域的問題,想通過客戶端模擬登錄的方式來實(shí)現(xiàn),但是總是不成功。
沒辦法,只好想盡一切辦法查看頁面源代碼,然后,找服務(wù)器的php文件,分析。
由于對(duì)php不熟悉,加上沒有仔細(xì)看,因此,對(duì)于找到的登錄頁面的php文件,一開始只是有一個(gè)初步的了解,基本上確定是通過cookie來實(shí)現(xiàn),實(shí)際上真正的驗(yàn)證機(jī)制還有如何驗(yàn)證都沒有了解清楚,急著就開始新的征程,結(jié)果屢試屢敗。
先說一下一開始的實(shí)現(xiàn)方式:
最開始
系統(tǒng)中添加一個(gè)iframe,試圖從本地應(yīng)用中給iframe中的遠(yuǎn)程系統(tǒng)的指定頁面的用戶名、密碼賦值,并模擬“登錄”按鈕的單擊事件。這個(gè)是必定失敗的,因?yàn)椋缬蛄?,js一般不能跨域遠(yuǎn)程操作別人的東西。
然后
本地form的遠(yuǎn)程action。在本地的頁面中新增一個(gè)form,此form中添加上與目標(biāo)系統(tǒng)一樣的登錄界面的內(nèi)容(就是用戶名、密碼輸入框,特別說明的是此應(yīng)用尚沒有驗(yàn)證碼),然后在頁面加載時(shí),便給form中的元素賦值,點(diǎn)擊本地頁面的“單點(diǎn)登錄”時(shí),提交此form,試圖按照java登錄驗(yàn)證的模式來實(shí)現(xiàn)此php系統(tǒng)的登錄驗(yàn)證。但是,依然,無法正常登錄。
接下來
仔細(xì)分析登錄的php文件。發(fā)現(xiàn)驗(yàn)證過程其實(shí)是通過cookie來實(shí)現(xiàn)的,依稀記得早期的很多BBS都是這種方式。找相關(guān)人員通過各種途徑,大體了解了登錄驗(yàn)證的機(jī)制及過程,原來是在登錄之后,將信息寫入cookie,每個(gè)頁面都會(huì)引入一個(gè)通過讀取cookie并根據(jù)cookie的內(nèi)容進(jìn)行判斷的php文件。這樣了解了驗(yàn)證機(jī)制。于是,想要通過跨域?qū)慶ookie的方式來實(shí)現(xiàn),由于本身的應(yīng)用是portal應(yīng)用,因此,寫跨域應(yīng)用也費(fèi)了一些勁,最終,寫本地cookie沒問題,但是跨域的cookie,連想都不用想,生成不了。
最后
分析php的登錄界面,發(fā)現(xiàn)之所以每次定向的登錄php文件,在進(jìn)行驗(yàn)證的時(shí)候,都有一個(gè)if(isset($submit) and $submit=="登錄")這樣的判斷,不是特別明白這句是什么意思,isset貌似是判斷參數(shù)是否為空,而后面則判斷參數(shù)值為“登錄”!由于本人php水平太低,不知道這樣的判斷有何作用,是否能夠執(zhí)行。最終,只能跟客戶討論是否可以通過在服務(wù)端新增一個(gè)專門用于接收單點(diǎn)登錄需要的php文件。只是把原來的登錄用的php文件做了修改,去掉這些判斷,并且原來的登錄在驗(yàn)證之后,跳轉(zhuǎn)到的目標(biāo)頁面是通過從地址欄獲取的信息來進(jìn)行跳轉(zhuǎn)的,因此,對(duì)此部分內(nèi)容也進(jìn)行了調(diào)增。這樣,最終形成了以下的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 姓名或者密碼錯(cuò)誤 $footer"; exit; } else{ //驗(yàn)證通過,設(shè)置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; } ?>