2014-06-19 65 views
0

我給大家介紹一個簡單的場景:休息重放攻擊/安全

有這個URI表示的REST資源:/ API /消息/ {}用戶ID。在用戶登錄後,將派發一個請求傳遞給這個URI「userid」(記錄的用戶)。這樣,只要用戶登錄,他就根據他的ID獲得他自己的消息。

如果用戶尚未記錄,則URI不可見(存在認證過濾器)。

問題是:如果一個已經登錄的用戶發現了這個URI,他可以提交一個請求傳遞另一個ID,這將導致安全問題,因爲他將能夠從另一個用戶獲得消息(只需傳遞任何隨機ID) 。

你能提出任何安全模型來防止這種安全漏洞嗎? (我認爲它更可能是一個交叉問題)。

謝謝,提前!

+0

然後根據url不要auth。使用cookie來傳遞認證數據。沒有該cookie,該網址將是無用的。 –

回答

0

就在我頭頂的時候,讓端點或者(a)只返回登錄用戶可見的消息,或者(b)只有當登錄用戶與userId相同時才返回消息在URI中。哪一個取決於您的業務規則。

+0

你的建議是在服務器端將每個請求都傳遞給服務(業務)層的用戶ID? 採用Web服務休息的一些原則,服務器是完全無狀態的,我希望將其作爲一個交叉概念來實現。我的問題是如何以這種方式實現它。 – MikeH

+0

@MikeH我不明白我的回覆是如何被這種擔憂所無效的。你的API必須有一些跟蹤誰在發出請求的方式:auth頭部,API密鑰等。這將告訴你登錄用戶是誰。沒有國家要求。如果你(b),你可以有一個過濾器檢查userId的傳入URI並將其與用戶名進行比較。我想這將是交叉的。 –

+0

@MikeH啊,我明白了,你*沒有任何方式跟蹤誰登錄。這是一個錯誤。我強烈建議你不要編寫自己的網絡安全體系結構。使用已存在的內容:基本身份驗證,OAuth 2等。 –

0

在您可以檢查用戶,然後看看是否有用戶ID匹配查找從用戶名的用戶ID的pathparam 是使用用戶名從數據庫中選擇ID爲便於端點

import javax.ws.rs.core.Context; 
import javax.ws.rs.core.SecurityContext; 
import ... blablabla; 

@GET 
@Path("messages/{userid}") 
public Response getMessages(@PathParam("userid") int userId, @Context SecurityContext context) { 

    String username = context.getUserPrincipal().getName(); 
    int id = getIdFromName(username); // define this yourself 
    if(userId==id) { 
     // output the message list 
     List<Message> msgs = getDemMessagesGURL(); // define this yourself 
     return Response.ok(new GenericEntity<List<T>>(msgs) {}).build(); 
    } else { 
     // output Forbidden(403) 
     return Response.status(403).build(); 
    } 

} 

和oauth您可以使用servlet過濾器來設置基於oauth signiture的用戶主體