3 回答

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

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

TA貢獻(xiàn)2011條經(jīng)驗(yàn) 獲得超2個(gè)贊
為了防止會(huì)話固定,這基本上是猜測(cè)SID或使用各種方法竊取它。無論您的會(huì)話邏輯多么復(fù)雜,從某種程度上來說,它肯定都會(huì)很容易被無聊的sessid竊取。因此,每次執(zhí)行重要操作時(shí)都必須重新生成ID。例如,如果您要在管理員中發(fā)布信息或更改設(shè)置,請(qǐng)首先運(yùn)行session-regenerate-id。然后,黑客必須經(jīng)歷再次對(duì)您進(jìn)行黑客攻擊的過程?;旧希@使黑客可以一次浪費(fèi)一次ID的機(jī)會(huì)。
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']也不是很可靠。嘗試避免這種情況不僅是因?yàn)檫@個(gè)原因,還因?yàn)樗鼘?duì)黑客很方便,因?yàn)樗麄冎来韽V泛用于此目的。而是嘗試使用$ _SESSION ['id_token'] = sha1(一些瘋狂的信息,例如文件內(nèi)存,文件名,時(shí)間)。
- 3 回答
- 0 關(guān)注
- 731 瀏覽
添加回答
舉報(bào)