PHP安全-會話固定
會話固定
關於會話,需要關注的主要問題是會話標識的保密性問題。如果它是保密的,就不會存在會話劫持的風險了。透過一個合法的會話標識,一個攻擊者可以非常成功地冒充成為你的某一個使用者。
一個攻擊者可以透過三種方法來取得合法的會話識別:
l 猜測
l 捕獲
l 固定
PHP產生的是隨機性很強的會話標識,所以被猜測的風險是不存在的。常見的是透過擷取網路通訊資料以獲得會話標識。為了避免會話標識被捕獲的風險,可以使用SSL,同時也要對瀏覽器漏洞及時修補。
小提示
要記住瀏覽器會根據請求中的Set-cookie頭部中的要求對之後所有的請求中都包含一個相應的Cookie頭部。最常見的是,會話標識會無謂的在對一些嵌入資源如圖片的請求中被暴露。例如,請求一個包含10個圖片的網頁時,瀏覽器會發出11個帶有會話標識的請求,但只有一個是有必要帶有標識的。為了防止這種無謂的暴露,你可以考慮把所有的嵌入資源放在有另外一個網域的伺服器上。
會話固定是一種誘騙受害者使用攻擊者指定的會話標識的攻擊手段。這是攻擊者獲取合法會話標識的最簡單的方法。
在這個最簡單的例子中,使用了一個連結進行會話固定攻擊:
<a href="http://example.org/index.php?PHPSESSID=1234">Click Here</a>
另一個方法是使用一個協定層級的轉向語句:
<?php header('Location: http://www.php.cn/'); ?>
這也可以透過Refresh頭部來進行,產生該頭部的方法是透過真正的HTTP頭部或meta標籤的http-equiv屬性指定。攻擊者的目標是讓使用者存取包含有攻擊者指定的會話標識的URL。這是一個基本的攻擊的第一步,完整的攻擊過程見圖4-3所示。
Figure 4-3. 使用攻擊者指定的會話標識進行的會話固定攻擊
如果成功了,攻擊者就能繞過抓取或猜測合法會話標識的需要,這就使發起更多和更危險的攻擊成為可能。
為了更好地使你理解這一步驟,最好的方法是你自己嘗試。先建立一個名為fixation.php的腳本:
<?php session_start(); $_SESSION['username'] = 'chris'; ?>
確認你沒有保存任何目前伺服器的cookies,或透過清除所有的cookies以確保這一點。透過包含PHPSESSID的URL造訪fixation.php:
http://www.php.cn/
它建立了一個值為chris的會話變數username。檢查會話儲存區後發現1234成為了該資料的會話識別:
$ cat /tmp/sess_1234 username|s:5:"chris";
建立第二段腳本test.php,它在$_SESSION['username'] 存在的情況即輸入出該值:
<?php session_start(); if (isset($_SESSION['username'])) { echo $_SESSION['username']; } ?>
在另外一台计算机上或者在另一个浏览器中访问下面的URL,同时该URL指定了相同的会话标识:
http://www.php.cn/
这使你可以在另一台计算机上或浏览器中(模仿攻击者所在位置)恢复前面在fixation.php中建立的会话。这样,你就作为一个攻击者成功地劫持了一个会话。
很明显,我们不希望这种情况发生。因为通过上面的方法,攻击者会提供一个到你的应用的链接,只要通过这个链接对你的网站进行访问的用户都会使用攻击者所指定的会话标识。
产生这个问题的一个原因是会话是由URL中的会话标识所建立的。当没有指定会话标识时,PHP就会自动产生一个。这就为攻击者大开了方便之门。幸运的是,我们以可以使用session_regenerate_id( )函数来防止这种情况的发生。
<?php session_start(); if (!isset($_SESSION['initiated'])) { session_regenerate_id(); $_SESSION['initiated'] = TRUE; } ?>
这就保证了在会话初始化时能有一个全新的会话标识。可是,这并不是防止会话固定攻击的有效解决方案。攻击者能简单地通过访问你的网站,确定PHP给出的会话标识,并且在会话固定攻击中使用该会话标识。
这确实使攻击者没有机会去指定一个简单的会话标识,如1234,但攻击者依然可以通过检查cookie或URL(依赖于标识的传递方式)得到PHP指定的会话标识。该流程如图4-4所示。
该图说明了会话的这个弱点,同时它可以帮助你理解该问题涉及的范围。会话固定只是一个基础,攻击的目的是要取得一个能用来劫持会话的标识。这通常用于这样的一个系统,在这个系统中,攻击者能合法取得较低的权限(该权限级别只要能登录即可),这样劫持一个具有较高权限的会话是非常有用的。
如果会话标识在权限等级有改变时重新生成,就可以在事实上避开会话固定的风险:
<?php $_SESSION['logged_in'] = FALSE; if (check_login()) { session_regenerate_id(); $_SESSION['logged_in'] = TRUE; } ?>
Figure 4-4. 通过首先初始化会话进行会话固定攻击
小提示
我不推荐在每一页上重新生成会话标识。虽然这看起来确实是一个安全的方法。但与在权限等级变化时重新生成会话标识相比,并没有提供更多的保护手段。更重要的是,相反地它还会对你的合法用户产生影响,特别是会话标识通过URL传递时尤甚。用户可能会使用浏览器的访问历史机制去访问以前访问的页面,这样该页上的链接就会指向一个不再存在的会话标识。
如果你只在权限等级变化时重新生成会话标识,同样的情况也有可以发生,但是用户在访问权限变更前的页面时,不会因为会话丢失而奇怪,同时,这种情况也不常见。
以上就是PHP安全-会话固定的内容,更多相关内容请关注PHP中文网(www.php.cn)!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

熱門話題

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

CakePHP 是 PHP 的開源框架。它旨在使應用程式的開發、部署和維護變得更加容易。 CakePHP 基於類似 MVC 的架構,功能強大且易於掌握。模型、視圖和控制器 gu

Visual Studio Code,也稱為 VS Code,是一個免費的原始碼編輯器 - 或整合開發環境 (IDE) - 可用於所有主要作業系統。 VS Code 擁有大量針對多種程式語言的擴展,可以輕鬆編寫

CakePHP 是一個開源MVC 框架。它使應用程式的開發、部署和維護變得更加容易。 CakePHP 有許多函式庫可以減少大多數常見任務的過載。

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元
