[英]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.