簡體   English   中英

Java:安全套接字接受

[英]Java: Secure socket accepting

我得到了別人編寫的這個多線程服務器應用程序。 當它要與它的ServerSocket對象一起接受一個Socket對象時,它正在通過一種名為“ acceptSocketSafe”的方法運行。

這是該程序的一個片段,其中包括了所需的代碼部分:

public Socket acceptSocketSafe(ServerSocket x)  {
    boolean socketFound = false;
    Socket socket = null;

    do  {
        try {
            socket = x.accept();
            int i = socket.getInputStream().read();

            if ((i & 0xFF) == 14)   {
                socketFound = true;
            }
        } catch (Exception e)   {

        }
    } while (!socketFound);

    return socket;
}

我不了解的是,“ acceptSocketSafe”方法如何使套接字接受比我本來會做的更安全(簡單,常規的方式)。 (我相信它可以排除出於惡意的連接(例如DDoS))。

感謝您對此方法的任何解釋!

它根本沒有使其更安全。 這使情況變得更糟。

該代碼在接受線程上執行客戶端I / O。 這意味着惡意客戶端進行DOS攻擊所需要做的就是連接並不發送任何內容。 然后,其他任何客戶端都無法接受,直到該客戶端發送內容或關閉連接。

至於它的作用,它只是拒絕不以14字節開頭的客戶端連接。 這是一個非常弱的測試:256次隨機嘗試中有1次會通過。 通過在應用程序協議中進行適當的錯誤檢查,可以更好地實現。 無論如何,您仍然必須這樣做,因此根本沒有實際優勢。

此代碼還會泄漏拒絕的套接字。

把它扔掉。

這是默默無聞的安全。 無論如何,套接字都被接受,只是它會檢查客戶端是否將0x0E(14)作為第一個字節發送。 如果不是,它將拋出(不關閉接受的套接字順便說一句)。

這仍然可以通過在連接后不發送任何內容來進行DDoS ...

編輯:更仔細地看,它甚至不需要是分布式攻擊。 一個不發送任何字節的客戶端將完全阻塞接受循環,完成任務。 誰寫的都不知道他在做什么。

暫無
暫無

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

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