PHP中的session安全嗎?,PHPsession安全_PHP教程

來源:互聯網
上載者:User

PHP中的session安全嗎?,PHPsession安全


做PHP開發這麼長時間,還真沒有真正關注過安全的問題,每次都是以完成項目為主,最近在網上看到了一篇關於安全的文章,看完以後才注意到自己以前的項目都存在著很大的安全性漏洞,於是挑了一個項目進行了測試,發現很容易就中招兒了。在這裡我會分享自己寫的一個測試的例子來說明PHP中的session是如何不安全的,以及在項目中如何加強其安全性。
對於session的原理機制,網上有很多好的文章來介紹,我們可以自行查閱。下面直接分享測試用的例子。
這個測試的例子主要就是一個登入頁,登入成功以後可以修改密碼,就這樣一個簡單的功能。
介面如下

首先是在項目入口的地方使用函數 session_start() 開啟了session。這樣當用戶端發起請求的時候,會產生一個身份標識 也就是 SessionID。通過cookie的方式儲存在用戶端,用戶端和服務端每次的通訊都是靠這個SessionID來進行身份識別的。
登入成功以後,會將 使用者id、使用者名稱存入session中

$_SESSION[‘userid'] = 使用者id$_SESSION[‘uname'] = 使用者名稱

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

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

對於修改密碼介面的調用是通過ajax post的方式將資料轉送到服務端的。

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

注意,我這裡將這段代碼寫在了html頁面中,所以說如果看到了html代碼,也就知道了介面地址了。
修改密碼的介面是這樣實現的,首先是判斷使用者是否登入,如果登入才會進行密碼的修改操作。
測試例子的實現思路大概就是上面介紹的那樣。
利用SessionID攻擊
1. 首先是擷取SessionID,當然攻擊者擷取此標識的方式有很多,由於我的水平有限,至於如何擷取我在這裡不做介紹。我們可以類比一下,先正常訪問此項目,然後通過瀏覽器查看SessionID,以此得到一個合法的使用者標識。可以在要求標頭中看到此項ID

 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3Connection: keep-aliveCookie: 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以後,如果此使用者登入成功,那麼服務端的session裡就有此使用者的資訊了。
2. 擷取到SessionID以後,假如攻擊者已經知道修改密碼的介面,就可以直接修改此使用者的密碼了。如果攻擊者還沒有得到介面地址,可以通過查看頁面代碼找出介面地址。可以使用如下的命令

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

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

……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();    } );……

3. 得到介面以後可以通過curl 類比post發送資料來修改密碼
命令如下

# curl --cookie "PHPSESSID=2eiq9hcpu3ksri4r587ckt9jt7" -d oldpass=111111 -d newpass=000000 -d userid=使用者id 介面地址

如果此使用者已經登入,那麼攻擊者可以通過執行以上命令修改使用者的密碼。
解決方案
對於以上方式的攻擊,我們可以通過使驗證方式複雜化來加強其安全性。其中一種方式就是利用要求標頭中的User-Agent項來加強其安全性

 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3Connection: keep-aliveCookie: 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

在項目開始的時候最初我們只是用了session_start()函數來開啟session。現在我們可以在session_start() 下面 添加這段代碼

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

然後在每次判斷是否登入的時候,添加判斷條件如下

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

這樣就可以避免上述簡單的攻擊。
總結:
當然,實際情況中的攻擊遠非這麼簡單,首先在擷取SessionID這一步就比較困難,然後就是和服務端互動的代碼盡量加密,可以避免上述的情況。在我們第二次修改代碼以後,可以增加攻擊的複雜程度,並不能杜絕攻擊。攻擊的方式多種多樣,這裡只是一種簡單的方式,僅提供一種思路,但是原理是一樣的,在實際情況中可以根據實際情況增強我們代碼的安全程度。

這裡只是分享自己在工作中碰到的問題,權當拋磚引玉,希望大家可以進一步深入學習。

您可能感興趣的文章:

  • PHP session有效期間session.gc_maxlifetime
  • php session安全問題分析
  • PHP session會話的安全性分析
  • 簡單的方法讓你的後台登入更加安全(php中加session驗證)
  • PHP中怎樣保持SESSION不到期 原理及方案介紹
  • 教你如何使用php session
  • PHP中session變數的銷毀
  • Session的工作機制詳解和安全性問題(PHP執行個體講解)
  • ThinkPHP的模版中調用session資料的方法
  • php中實現精確設定session到期時間的方法

http://www.bkjia.com/PHPjc/1094755.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/1094755.htmlTechArticlePHP中的session安全嗎?,PHPsession安全 做PHP開發這麼長時間,還真沒有真正關注過安全的問題,每次都是以完成項目為主,最近在網上看到了...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.