最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PHP中的session安全嗎?

 更新時間:2016年01月22日 10:34:00   作者:跡憶  
PHP中的session安全嗎?PHP只是為我們提供了一個session的實現(xiàn),后續(xù)的安全工作需要程序員自己靈活去掌握,所以說PHP編程真的很靈活,需要了解PHP中session安全的朋友可以參考一下

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

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

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

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

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

對于修改密碼接口的調用是通過ajax  post的方式將數(shù)據(jù)傳輸?shù)椒斩说摹?br />

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

注意,我這里將這段代碼寫在了html頁面中,所以說如果看到了html代碼,也就知道了接口地址了。
修改密碼的接口是這樣實現(xiàn)的,首先是判斷用戶是否登錄,如果登錄才會進行密碼的修改操作。
測試例子的實現(xiàn)思路大概就是上面介紹的那樣。
利用SessionID攻擊
1. 首先是獲取SessionID,當然攻擊者獲取此標識的方式有很多,由于我的水平有限,至于如何獲取我在這里不做介紹。我們可以模擬一下,先正常訪問此項目,然后通過瀏覽器查看SessionID,以此得到一個合法的用戶標識??梢栽谡埱箢^中看到此項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以后,如果此用戶登錄成功,那么服務端的session里就有此用戶的信息了。
2. 獲取到SessionID以后,假如攻擊者已經(jīng)知道修改密碼的接口,就可以直接修改此用戶的密碼了。如果攻擊者還沒有得到接口地址,可以通過查看頁面代碼找出接口地址。可以使用如下的命令

#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="確認密碼"></span>
<input type="button" class="btn_ok" value="確認修改" />

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

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

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

 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

在項目開始的時候最初我們只是用了session_start()函數(shù)來開啟session?,F(xiàn)在我們可以在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這一步就比較困難,然后就是和服務端交互的代碼盡量加密,可以避免上述的情況。在我們第二次修改代碼以后,可以增加攻擊的復雜程度,并不能杜絕攻擊。攻擊的方式多種多樣,這里只是一種簡單的方式,僅提供一種思路,但是原理是一樣的,在實際情況中可以根據(jù)實際情況增強我們代碼的安全程度。

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

相關文章

  • PHP strripos函數(shù)用法總結

    PHP strripos函數(shù)用法總結

    在本篇文章里小編給大家分享了關于PHP strripos函數(shù)用法知識點,有興趣的朋友們學習下。
    2019-02-02
  • PHP實現(xiàn)通用alert函數(shù)的方法

    PHP實現(xiàn)通用alert函數(shù)的方法

    這篇文章主要介紹了PHP實現(xiàn)通用alert函數(shù)的方法,實例分析了php自定義alert函數(shù)實現(xiàn)提示信息的技巧,非常具有實用價值,需要的朋友可以參考下
    2015-03-03
  • Linux下安裝Memcached服務器和客戶端與PHP使用示例

    Linux下安裝Memcached服務器和客戶端與PHP使用示例

    這篇文章主要介紹了Linux下安裝Memcached服務器和客戶端與PHP使用,結合實例形式分析了Linux環(huán)境下的Memcached服務器和客戶端安裝命令、注意事項及php相關使用技巧,需要的朋友可以參考下
    2019-04-04
  • php讀取txt文件并將數(shù)據(jù)插入到數(shù)據(jù)庫

    php讀取txt文件并將數(shù)據(jù)插入到數(shù)據(jù)庫

    這篇文章主要介紹了php讀取txt文件并將數(shù)據(jù)插入到數(shù)據(jù)庫的方法和示例代碼,小文件大家可以參考第一種,大文件導入的話請參考第二種。
    2016-02-02
  • php生成隨機密碼的三種方法小結

    php生成隨機密碼的三種方法小結

    使用PHP開發(fā)應用程序,尤其是網(wǎng)站程序,常常需要生成隨機密碼,如用戶注冊生成隨機密碼,用戶重置密碼也需要生成一個隨機的密碼。
    2010-09-09
  • PHP反序列化字符串逃逸實例詳解

    PHP反序列化字符串逃逸實例詳解

    這篇文章主要給大家介紹了關于PHP反序列化字符串逃逸的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02
  • 簡單實現(xiàn)限定phpmyadmin訪問ip的方法

    簡單實現(xiàn)限定phpmyadmin訪問ip的方法

    如果你需要限定phpmyadmin特定的ip地址段進行訪問,一個簡單的方式可以在配置文件中進行簡單限定。
    2013-03-03
  • PHP投票系統(tǒng)防刷票判斷流程分析

    PHP投票系統(tǒng)防刷票判斷流程分析

    目前來說,PHP防止刷票的判斷沒有太可行和完全防止的方法,需要的朋友可以參考下
    2012-02-02
  • php中的異常和錯誤淺析

    php中的異常和錯誤淺析

    PHP錯誤是屬于php程序自身的問題,一般是由非法的語法,環(huán)境問題導致的,使得編譯器無法通過檢查甚至無法運行的情況。PHP異常一般是業(yè)務邏輯上出現(xiàn)的不合預期、與正常流程不同的狀況,不是語法錯誤。本文介紹了php中異常和錯誤的相關資料,需要的朋友可以參考下。
    2017-05-05
  • PHP中全面阻止SQL注入式攻擊分析小結

    PHP中全面阻止SQL注入式攻擊分析小結

    PHP是一種力量強大但相當容易學習的服務器端腳本語言,即使是經(jīng)驗不多的程序員也能夠使用它來創(chuàng)建復雜的動態(tài)的web站點。然而,它在實現(xiàn)因特網(wǎng)服務的秘密和安全方面卻常常存在許多困難
    2012-01-01

最新評論

鄂伦春自治旗| 万全县| 南昌县| 海原县| 山西省| 双辽市| 武清区| 津南区| 成都市| 资溪县| 武川县| 蒲城县| 仙桃市| 锡林郭勒盟| 光山县| 青田县| 涿鹿县| 紫金县| 德惠市| 南华县| 枣阳市| 湾仔区| 峡江县| 比如县| 嘉善县| 泾阳县| 页游| 普兰县| 上高县| 遵义市| 克东县| 吉首市| 河津市| 威远县| 南投市| 井冈山市| 板桥市| 广昌县| 汤阴县| 白水县| 礼泉县|