搜尋
首頁後端開發php教程使用php 中的session安全嗎?

使用php 中的session安全嗎?

Jul 05, 2017 am 09:44 AM
phpsession安全

PHP中的session安全性嗎? PHP只是為我們提供了一個session的實現,後續的安全工作需要程式設計師自己靈活去掌握,所以說PHP程式真的很靈活,需要了解PHP中session安全的朋友可以參考一下

做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.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以後,如果攻擊者已經知道修改密碼的接口,就可以直接修改此使用者的密碼了。如果攻擊者還沒有得到介面位址,可以透過查看頁面代碼找出介面位址。可以使用如下的命令

#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(&#39;(&#39; +data+ &#39;)&#39;);
      $(&#39;.grant_info&#39;).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發送資料來修改密碼
指令如下

# 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.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()函數來開啟session。現在我們可以在session_start() 下面 新增這段程式碼

$_SESSION[‘User_Agent&#39;] = md5($_SERVER[‘HTTP_USER_AGENT&#39;]);

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

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

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

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

以上是使用php 中的session安全嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
PHP類型提示如何起作用,包括標量類型,返回類型,聯合類型和無效類型?PHP類型提示如何起作用,包括標量類型,返回類型,聯合類型和無效類型?Apr 17, 2025 am 12:25 AM

PHP類型提示提升代碼質量和可讀性。 1)標量類型提示:自PHP7.0起,允許在函數參數中指定基本數據類型,如int、float等。 2)返回類型提示:確保函數返回值類型的一致性。 3)聯合類型提示:自PHP8.0起,允許在函數參數或返回值中指定多個類型。 4)可空類型提示:允許包含null值,處理可能返回空值的函數。

PHP如何處理對象克隆(克隆關鍵字)和__clone魔法方法?PHP如何處理對象克隆(克隆關鍵字)和__clone魔法方法?Apr 17, 2025 am 12:24 AM

PHP中使用clone關鍵字創建對象副本,並通過\_\_clone魔法方法定制克隆行為。 1.使用clone關鍵字進行淺拷貝,克隆對象的屬性但不克隆對象屬性內的對象。 2.通過\_\_clone方法可以深拷貝嵌套對象,避免淺拷貝問題。 3.注意避免克隆中的循環引用和性能問題,優化克隆操作以提高效率。

PHP與Python:用例和應用程序PHP與Python:用例和應用程序Apr 17, 2025 am 12:23 AM

PHP適用於Web開發和內容管理系統,Python適合數據科學、機器學習和自動化腳本。 1.PHP在構建快速、可擴展的網站和應用程序方面表現出色,常用於WordPress等CMS。 2.Python在數據科學和機器學習領域表現卓越,擁有豐富的庫如NumPy和TensorFlow。

描述不同的HTTP緩存標頭(例如,Cache-Control,ETAG,最後修飾)。描述不同的HTTP緩存標頭(例如,Cache-Control,ETAG,最後修飾)。Apr 17, 2025 am 12:22 AM

HTTP緩存頭的關鍵玩家包括Cache-Control、ETag和Last-Modified。 1.Cache-Control用於控制緩存策略,示例:Cache-Control:max-age=3600,public。 2.ETag通過唯一標識符驗證資源變化,示例:ETag:"686897696a7c876b7e"。 3.Last-Modified指示資源最後修改時間,示例:Last-Modified:Wed,21Oct201507:28:00GMT。

說明PHP中的安全密碼散列(例如,password_hash,password_verify)。為什麼不使用MD5或SHA1?說明PHP中的安全密碼散列(例如,password_hash,password_verify)。為什麼不使用MD5或SHA1?Apr 17, 2025 am 12:06 AM

在PHP中,應使用password_hash和password_verify函數實現安全的密碼哈希處理,不應使用MD5或SHA1。1)password_hash生成包含鹽值的哈希,增強安全性。 2)password_verify驗證密碼,通過比較哈希值確保安全。 3)MD5和SHA1易受攻擊且缺乏鹽值,不適合現代密碼安全。

PHP:服務器端腳本語言的簡介PHP:服務器端腳本語言的簡介Apr 16, 2025 am 12:18 AM

PHP是一種服務器端腳本語言,用於動態網頁開發和服務器端應用程序。 1.PHP是一種解釋型語言,無需編譯,適合快速開發。 2.PHP代碼嵌入HTML中,易於網頁開發。 3.PHP處理服務器端邏輯,生成HTML輸出,支持用戶交互和數據處理。 4.PHP可與數據庫交互,處理表單提交,執行服務器端任務。

PHP和網絡:探索其長期影響PHP和網絡:探索其長期影響Apr 16, 2025 am 12:17 AM

PHP在過去幾十年中塑造了網絡,並將繼續在Web開發中扮演重要角色。 1)PHP起源於1994年,因其易用性和與MySQL的無縫集成成為開發者首選。 2)其核心功能包括生成動態內容和與數據庫的集成,使得網站能夠實時更新和個性化展示。 3)PHP的廣泛應用和生態系統推動了其長期影響,但也面臨版本更新和安全性挑戰。 4)近年來的性能改進,如PHP7的發布,使其能與現代語言競爭。 5)未來,PHP需應對容器化、微服務等新挑戰,但其靈活性和活躍社區使其具備適應能力。

為什麼要使用PHP?解釋的優點和好處為什麼要使用PHP?解釋的優點和好處Apr 16, 2025 am 12:16 AM

PHP的核心優勢包括易於學習、強大的web開發支持、豐富的庫和框架、高性能和可擴展性、跨平台兼容性以及成本效益高。 1)易於學習和使用,適合初學者;2)與web服務器集成好,支持多種數據庫;3)擁有如Laravel等強大框架;4)通過優化可實現高性能;5)支持多種操作系統;6)開源,降低開發成本。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前By尊渡假赌尊渡假赌尊渡假赌

熱工具

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器