簡體   English   中英

PHP套接字服務器(用於Android推送通知) - 安全/身份驗證問題

[英]PHP Socket Server (for Android Push Notifications) - Security / Authentication Issue

我最近在PHP中編寫了一個套接字服務器,它將處理Android手機應用程序和我的PHP網絡服務器之間的通信。 由於Android本身不支持推送式通知,我們將使用我們的Web服務器作為中間件層來處理我們的“推送”。

套接字服務器穩定,運行良好,似乎可以很好地擴展。 雖然我最終想在CI中重新編寫它,但是現在沒有必要的技能,所以我將至少在PHP中停留一段時間。 到目前為止,我們的Android模擬器能夠通過服務器進行通信,推送等等,以便部分全部覆蓋。

我擔心的是,現在,任何人都可以打開我的服務器的套接字,並將獲得客戶端連接。 雖然我們不會來回傳遞敏感數據,但我不想讓任何人連接並接收廣播信息,耗盡我的資源,並阻塞我的服務器。

問題是,如何保護這樣的服務器? 讓我們假設我在端口25,000上運行 - 我可以在該端口上設置某種SSL層,並期望像Android這樣的設備能夠通過該端口進行通信,而無需任何特殊協議或跳過箍?

我已經考慮過要求連接客戶端在給定客戶端連接之前根據我們的用戶數據庫對用戶進行身份驗證,但是這需要通過網絡以純文本形式傳遞憑據,我不打算這樣做。

任何有關這方面的建議都會非常有用 - 我對PHP的直接TCP通信很新,並且覺得我可能只是缺少一些允許在此級別進行身份驗證的簡單方法。

附加信息:如果我能夠安全地獲得有效的用戶名和密碼,我將使用MySQL來驗證用戶,然后根據查詢結果接受/拒絕他們的連接。

提前致謝..

首先,我希望您以一種允許同時連接多個客戶端的方式實現您的PHP套接字服務器。 這不是因為在PHP中缺少線程應該是微不足道的,但它肯定是。

現在,如果您已經實現了套接字服務器,那么添加TLS支持很容易。 只需運行stunnel並讓您的PHP套接字服務器只接受本地接口上的請求。

我不認為SSL真的會解決你的問題。 最好使用SSL,您可以為每個客戶端提供客戶端證書,並在服務器上進行客戶端證書驗證。 但是你需要管理大量的證書。 或者給每個人相同的客戶證書(不是一個好主意)。

您必須使用其憑據對客戶端進行身份驗證。 你是對的,你不想通過網絡以純文本形式發送憑證,但有一些簡單的替代方案。 請查看HTTP摘要式身份驗證( http://en.wikipedia.org/wiki/Digest_access_authentication )或xAuth( http://dev.twitter.com/pages/xauth )。 您不必通過HTTP實現這些技術; 您可以在接受連接后通過簡單的tcp套接字發送挑戰(領域)。 然后,客戶端應在短時間內發送有效響應,否則服務器將中止連接。

順便問一下,您是否考慮過HTTP流媒體? 請參閱http://ajaxpatterns.org/HTTP_Streaming這可能會讓您的生活變得更輕松,因為您可以依賴其他服務(例如Apache)為您做出艱苦的工作,並且您可以專注於應用程序的業務價值。

您可能需要考慮:雲到設備消息: http//code.google.com/android/c2dm/index.html

唯一的缺點是它只支持android> = 2.2

不知道為什么你們沒有使用一些現成的消息庫/服務器為java,然后創建一個連接到消息代理並處理所有初始身份驗證的android服務。 該服務只是坐在那里等待任何傳入的消息。

(我很確定收聽網絡數據不會打開無線電,只有當數據確實存在時,無線電上電。我懷疑這是C2DM的工作原理。)這比輪詢更好,因為你是只等待數據。 您不是經常發送請求數據的數據包。 但是你已經知道了。

我做了這個,(我使用了rabbitmq-java庫和rabbitmq消息隊列服務器),並且在任何時候都為我的應用程序提供了樣式通知。 即使使用Android 1.5設備。

關於安全:

您也可以實現自己的安全性,但無需發送純文本密碼。 只需在通過網絡之前使用MD5等密碼對密碼進行加密。
然后將加密密碼與您存檔的加密密碼進行比較。 這樣,只有加密的密碼才能通過網絡。

暫無
暫無

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

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