簡體   English   中英

PHP + socket.io(會話,授權和安全問題)

[英]PHP + socket.io (session, authorizing and security problems)

我有一個工作的PHP應用程序,我想在其中添加實時支持。 我想使用nodejs / socket.io來添加這種功能。

我發現的第一個問題是如何在nodejs端正確授權用戶(用戶已經通過PHP會話在php后端進行了身份驗證)。 在nodejs端使用socket.handshake.header.cookie我可以解析並獲取PHP會話ID,我可以通過redis / memcache / database進行身份驗證(取決於我用來保存會話信息的內容)。
當用戶只打開一個站點的選項卡/窗口時,一切看起來都很酷 - 當擁有更多並使用session_regenerate_id()時 ,在nodejs中用戶使用另一個sessionid鍵進行身份驗證,因此除了他們連接的套接字ID之外,我無法區分兩個選項卡用。 當用戶注銷時,他不應該在任何選項卡上收到任何消息(因為他已經從該瀏覽器的每個選項卡/窗口中注銷)。 所以在注銷消息(在注銷PHP之前從瀏覽器發送的東西)我應該刪除連接到授權用戶ID的所有套接字連接。 但是,如果用戶登錄兩個設備(例如PC瀏覽器和ipad safaris),該怎么辦? 在一台設備上注銷后,他不應該在他注銷的設備上收到任何消息,而不是在每台設備上。 如何區分socket.io中不同設備/瀏覽器的連接? 當然不使用session_regenerate_id()會很有效,但如果我真的想使用這個功能,我該怎么辦?

我遇到的另一個問題是安全問題(甚至問題)。 讓我們假設應用程序中的授權用戶可以看到頁面example.com/user1 (這是user1的新聞源),但是看不到example.com/user2 (例如,他沒有權限查看它)。 我希望socket.io在用戶訪問example.com/user1時向瀏覽器發送更新消息,當用戶在example.com/user2站點上時當然不發送。 在socket.io端,我可以讀取引用地址(因此,當用戶在user2站點上時,他沒有得到任何socket.io連接)。 問題是: 我應該將引用地址與node.js端的經過身份驗證的用戶的權限進行比較嗎? 或者,node.js端的referer值是否安全 在node.js端添加另一個db檢查會降低它的速度(因為幾乎每個請求都應該在兩端進行相同的數據庫檢查 - PHP和node.js)。

或者也許socket.io + PHP應用程序的整個概念以我提出的方式工作是錯誤的?

UPDATE

我想我找到了一種方法來省略第一個問題的問題 - 基本上我只是添加另一個cookie(除了PHPSESSID)fe。 名為NODESESSID,我在用戶被授權時生成(fe。使用uniqid())。 現在,node.js端的授權正在比較PHPSESSID和NODESESSID(兩者必須匹配)。 現在,當用戶注銷時,他將消息注銷傳遞給socket.io,socket.io斷開所有使用NODESESSID的套接字。 這就像連接重新生成會話ID的好處而不是重新生成會話ID(但不容易受到會話固定的影響,不是嗎?)。

對於你的第二個問題:

如評論中所述,Referer並不安全。

我在我的應用程序中遇到了類似的問題,這就是它對我有用的方式。

首先,我有一個單頁應用程序,其中所有流量都通過套接字,但這不是必需的。 它應該以您管理它的方式使用會話。

在nodejs onConnect中我詢問后端是否對用戶進行了身份驗證,然后將userid存儲到套接字對象(socket.data)中,並且還填充了一個hashmap以直接從userids查找套接字。

第二,我使用Redis並從nodejs訂閱redis列表( 參見redis pub / sub )。 php后端使用userid將此列表中的消息推送到消息中。 nodejs接收此消息(例如,新的新聞訂閱源項),在提到的hashmap中查找userid並將其發送到客戶端。 因此,用戶只能獲得他的授權。 然后客戶決定如何處理該消息。 如果用戶在他的Feed頁面上,則可以添加該項目。 如果用戶使用其他人,則只需在頁面上的其他位置添加通知即可。 它也可能會丟棄它。

在php后端站點上,每次發生事件時都會將此消息發送到redis,需要在某個連接的客戶端上顯示。 如果user1在user2的feed上發布,則新項目將存儲在數據庫中,同時作為消息發送到redis隊列。

此系統還有助於減少數據庫負載,因為nodejs只需要查詢數據庫以確保已連接的用戶已經過身份驗證。

實際上,你可以避免使用node.js,並使用phpdaemon ,它用PHP編寫並且工作得非常好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM