3 回答

TA貢獻1801條經(jīng)驗 獲得超16個贊
術(shù)語
用戶:訪客。
客戶端:安裝在特定計算機上的特定于Web的軟件。
了解會議
為了了解如何使會話安全,您必須首先了解會話的工作方式。
讓我們看一下這段代碼:
session_start();
調(diào)用后,PHP將查找名為PHPSESSID(默認情況下)的cookie 。如果找不到,它將創(chuàng)建一個:
PHPSESSID=h8p6eoh3djplmnum2f696e4vq3
如果找到它,它將采用值,PHPSESSID然后加載相應(yīng)的會話。該值稱為session_id。
那是客戶唯一會知道的。您添加到會話變量中的任何內(nèi)容都將保留在服務(wù)器上,并且永遠不會傳輸?shù)娇蛻舳?。如果您更改的?nèi)容,則該變量不會更改$_SESSION。在您銷毀它或超時之前,它始終保持不變。因此,嘗試$_SESSION通過散列或其他方式來混淆內(nèi)容是沒有用的,因為客戶端從不接收或發(fā)送該信息。
然后,在新會話的情況下,您將設(shè)置變量:
$_SESSION['user'] = 'someuser';
客戶將永遠不會看到該信息。
問題
當惡意用戶竊取session_id其他用戶的安全性時,可能會出現(xiàn)安全問題。如果沒有某種檢查,他將可以自由地模擬該用戶。我們需要找到一種唯一標識客戶端(而非用戶)的方法。
一種策略(最有效)涉及檢查啟動會話的客戶端的IP是否與使用會話的人的IP相同。
if(logging_in()) {
$_SESSION['user'] = 'someuser';
$_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
}
// The Check on subsequent load
if($_SESSION['ip'] != $_SERVER['REMOTE_ADDR']) {
die('Session MAY have been hijacked');
}
該策略的問題在于,如果客戶端使用負載平衡器,或者(在長時間會話中)用戶具有動態(tài)IP,則會觸發(fā)錯誤警報。
另一種策略涉及檢查客戶端的用戶代理:
if(logging_in()) {
$_SESSION['user'] = 'someuser';
$_SESSION['agent'] = $_SERVER['HTTP_USER_AGENT'];
}
// The Check on subsequent load
if($_SESSION['agent'] != $_SERVER['HTTP_USER_AGENT']) {
die('Session MAY have been hijacked');
}
該策略的缺點是,如果客戶端升級瀏覽器或安裝插件(某些插件添加到用戶代理),則用戶代理字符串將更改,并會觸發(fā)錯誤警報。
另一種策略是session_id每5個請求輪換一次。這樣一來,session_id理論上停留的時間就不足以被劫持。
if(logging_in()) {
$_SESSION['user'] = 'someuser';
$_SESSION['count'] = 5;
}
// The Check on subsequent load
if(($_SESSION['count'] -= 1) == 0) {
session_regenerate_id();
$_SESSION['count'] = 5;
}
您可以根據(jù)需要組合所有這些策略,但同時也要組合不利因素。
不幸的是,沒有解決方案是萬無一失的。如果您session_id受到侵害,那么您就已經(jīng)做好了。以上策略只是權(quán)宜之計。

TA貢獻1866條經(jīng)驗 獲得超5個贊
這是荒唐的。
當(通常通過跨站點腳本攻擊)某人攔截您的sessionId(這是瀏覽器自動發(fā)送到Web服務(wù)器的cookie)時,就會發(fā)生會話劫持。
例如,有人發(fā)布了此信息:
因此,當用戶登錄時:
//不是最安全的哈希!$ _SESSION ['checksum'] = md5($ _ SESSION ['username']。$ salt);
在進入敏感區(qū)域之前:
if(md5($ _ SESSION ['username']。$ salt)!= $ _SESSION ['checksum']){
handleSessionError(); }
讓我們來看看這是怎么回事
鹽-沒錯,但毫無意義。沒有人在破解您該死的md5,誰在乎它是否咸
將SESSION變量的md5與SESSION中存儲的同一變量的md5進行比較-您正在比較會話之間的會話。如果該東西被劫持,將無濟于事。
$_SESSION['logged_in'] = 1;
$_SESSION['username'] = $username; // user's name
$_SESSION['hash'] = md5($YOUR_SALT.$username.$_SERVER['HTTP_USER_AGENT']);
//對用戶名進行散列以避免操作
避免由誰操縱?神奇的會議仙境?除非服務(wù)器受到威脅,否則不會修改會話變量。哈希實際上僅是用來將您的字符串很好地壓縮為48個字符串(用戶代理可能會有點長)。
至少,但是,我們現(xiàn)在正在檢查一些客戶端數(shù)據(jù),而不是檢查從SESSION到SESSION數(shù)據(jù),他們已經(jīng)檢查了HTTP_USER_AGENT(用于標識瀏覽器的字符串),這可能足以保護您,但您必須意識到如果此人已經(jīng)以某種方式獲取了您的sessionId,則很可能是您還向惡意者服務(wù)器發(fā)送了一個請求,并為該惡意者提供了您的用戶代理,因此,聰明的黑客會欺騙您的用戶代理并破壞此保護。
你真是可悲的是。
一旦您的會話ID遭到破壞,您就走了。您可以檢查請求的遠程地址,并確保所有請求中的遠程地址都相同(就像我所做的一樣),并且可以完美地滿足您99%的客戶群的需求。然后,有一天,您會收到一個用戶的呼叫,該用戶使用具有負載平衡代理服務(wù)器的網(wǎng)絡(luò),請求將通過一組不同的IP(有時甚至在錯誤的網(wǎng)絡(luò)上)從此處發(fā)出,他將丟失自己的電話會議左,右,中。

TA貢獻2011條經(jīng)驗 獲得超2個贊
為了防止會話固定,這基本上是猜測SID或使用各種方法竊取它。無論您的會話邏輯多么復(fù)雜,從某種程度上來說,它肯定都會很容易被無聊的sessid竊取。因此,每次執(zhí)行重要操作時都必須重新生成ID。例如,如果您要在管理員中發(fā)布信息或更改設(shè)置,請首先運行session-regenerate-id。然后,黑客必須經(jīng)歷再次對您進行黑客攻擊的過程?;旧希@使黑客可以一次浪費一次ID的機會。
http://us.php.net/manual/zh/function.session-regenerate-id.php
或者您可以每隔一圈更改ID
if($ _ SESSION ['counter'] == 3){session_regenerate_id(); $ _ SESSION ['counter'] == 0}
另外,$ _SERVER ['HTTP_USER_AGENT']也不是很可靠。嘗試避免這種情況不僅是因為這個原因,還因為它對黑客很方便,因為他們知道代理廣泛用于此目的。而是嘗試使用$ _SESSION ['id_token'] = sha1(一些瘋狂的信息,例如文件內(nèi)存,文件名,時間)。
- 3 回答
- 0 關(guān)注
- 732 瀏覽
添加回答
舉報