溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

PHP中的session安不安全

發(fā)布時(shí)間:2021-01-19 15:58:50 來源:億速云 閱讀:183 作者:Leah 欄目:開發(fā)技術(shù)

這篇文章將為大家詳細(xì)講解有關(guān)PHP中的session安不安全,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

首先是在項(xiàng)目入口的地方使用函數(shù) session_start() 開啟了session。這樣當(dāng)客戶端發(fā)起請(qǐng)求的時(shí)候,會(huì)產(chǎn)生一個(gè)身份標(biāo)識(shí) 也就是 SessionID。通過cookie的方式保存在客戶端,客戶端和服務(wù)端每次的通信都是靠這個(gè)SessionID來進(jìn)行身份識(shí)別的。

登錄成功以后,會(huì)將 用戶id、用戶名存入session中

$_SESSION[‘userid'] = 用戶id
$_SESSION[‘uname'] = 用戶名

以后所有的操作都是通過判斷 $_SESSION[‘userid']是否存在來檢查用戶是否登錄。代碼如下:

if(isset($_SESSION['userid'])) return true;

對(duì)于修改密碼接口的調(diào)用是通過ajax  post的方式將數(shù)據(jù)傳輸?shù)椒?wù)端的。

$.post("接口*******",
  {
     oldpass:oldpass,
     newpass:newpass,
     userid:uid,
  },
  function(data){
     data = eval('(' +data+ ')');
     $('.grant_info').html(infos[data.info]).show();
  }
);

注意,我這里將這段代碼寫在了html頁面中,所以說如果看到了html代碼,也就知道了接口地址了。
修改密碼的接口是這樣實(shí)現(xiàn)的,首先是判斷用戶是否登錄,如果登錄才會(huì)進(jìn)行密碼的修改操作。
測試?yán)拥膶?shí)現(xiàn)思路大概就是上面介紹的那樣。
利用SessionID攻擊
1. 首先是獲取SessionID,當(dāng)然攻擊者獲取此標(biāo)識(shí)的方式有很多,由于我的水平有限,至于如何獲取我在這里不做介紹。我們可以模擬一下,先正常訪問此項(xiàng)目,然后通過瀏覽器查看SessionID,以此得到一個(gè)合法的用戶標(biāo)識(shí)??梢栽谡?qǐng)求頭中看到此項(xiàng)ID

 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Connection: keep-alive
Cookie: Hm_lvt_bf1154ec41057869fceed66e9b3af5e7=1450428827,1450678226,1450851291,1450851486; PHPSESSID=2eiq9hcpu3ksri4r587ckt9jt7;
Host: ******
Referer: ******
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:41.0) Gecko/20100101 Firefox/41.0

得到sessionID以后,如果此用戶登錄成功,那么服務(wù)端的session里就有此用戶的信息了。
2. 獲取到SessionID以后,假如攻擊者已經(jīng)知道修改密碼的接口,就可以直接修改此用戶的密碼了。如果攻擊者還沒有得到接口地址,可以通過查看頁面代碼找出接口地址??梢允褂萌缦碌拿?br/>

#curl --cookie "PHPSESSID=2eiq9hcpu3ksri4r587ckt9jt7" 頁面地址

上面我們說過,在此例子中ajax代碼是寫在html頁面中的,所以在此頁面可以查看到接口地址
部分html代碼如下

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
……
var uid = $(".userid").val();
$.post("/User/User/modifypass_do",
     {
        oldpass:oldpass,
        newpass:newpass,
        userid:uid,
     },
    function(data){
      data = eval('(' +data+ ')');
      $('.grant_info').html(infos[data.info]).show();
    }
 );
……
<span><input type="password" name="oldpass" id="textfield_o" placeholder="原密碼"></span>
<span><input type="password" name="newpass" id="textfield_n" placeholder="新密碼"></span>
<span><input type="password" name="confirmpass" id="textfield_c" placeholder="確認(rèn)密碼"></span>
<input type="button" class="btn_ok" value="確認(rèn)修改" />

3. 得到接口以后可以通過curl 模擬post發(fā)送數(shù)據(jù)來修改密碼
命令如下

# curl --cookie "PHPSESSID=2eiq9hcpu3ksri4r587ckt9jt7" -d oldpass=111111 -d newpass=000000 -d userid=用戶id 接口地址

如果此用戶已經(jīng)登錄,那么攻擊者可以通過執(zhí)行以上命令修改用戶的密碼。
解決方法
對(duì)于以上方式的攻擊,我們可以通過使驗(yàn)證方式復(fù)雜化來加強(qiáng)其安全性。其中一種方式就是利用請(qǐng)求頭中的User-Agent項(xiàng)來加強(qiáng)其安全性

 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Connection: keep-alive
Cookie: Hm_lvt_bf1154ec41057869fceed66e9b3af5e7=1450428827,1450678226,1450851291,1450851486; PHPSESSID=2eiq9hcpu3ksri4r587ckt9jt7;
Host: ******
Referer: ******
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:41.0) Gecko/20100101 Firefox/41.0

在項(xiàng)目開始的時(shí)候最初我們只是用了session_start()函數(shù)來開啟session?,F(xiàn)在我們可以在session_start() 下面 添加這段代碼

$_SESSION[‘User_Agent'] = md5($_SERVER[‘HTTP_USER_AGENT']);

然后在每次判斷是否登錄的時(shí)候,添加判斷條件如下

If(isset($_SESSION[‘userid']) && $_SESSION[‘User_Agent'] == md5($_SERVER[‘HTTP_USER_AGENT'])){
    return true;
}

這樣就可以避免上述簡單的攻擊。
總結(jié):
當(dāng)然,實(shí)際情況中的攻擊遠(yuǎn)非這么簡單,首先在獲取SessionID這一步就比較困難,然后就是和服務(wù)端交互的代碼盡量加密,可以避免上述的情況。在我們第二次修改代碼以后,可以增加攻擊的復(fù)雜程度,并不能杜絕攻擊。攻擊的方式多種多樣,這里只是一種簡單的方式,僅提供一種思路,但是原理是一樣的,在實(shí)際情況中可以根據(jù)實(shí)際情況增強(qiáng)我們代碼的安全程度。

關(guān)于PHP中的session安不安全就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI