2012-01-03 37 views
4

我有一個jsp包含一個jquery post到我的tomcat服務器上的一個servlet,它創建了一個HttpServletRequest。我想確保只有我的jsp對我的servlet的調用被處理,並且任何來自非jsp的源的請求都被忽略。 是否有保證的方式來查看調用我的服務器的引用頁面是什麼?我讀過使用request.getHeader("referer")可以欺騙,所以我知道我不能依靠這一點。誰在呼叫我的HttpServletRequest?

回答

5

生成一個唯一的字符串作爲標記,將其存儲在會話中,並將其作爲隱藏的輸入值嵌入到JSP的POST表單中,最後在標記有效的情況下檢查servlet。

基本上:

在創建會話(在HttpSessionListener#sessionCreated(),例如):

Set<String> tokens = new HashSet<String>(); 
event.getSession().setAttribute("tokens", tokens); 

在JSP請求的預處理(在HttpServlet#doGet(),例如):

String token = UUID.randomUUID().toString(); 
Set<String> tokens = (Set<String>) request.getSession().getAttribute("tokens"); 
tokens.add(token); 
request.setAttribute("token", token); 

在處理JSP本身:

<input type="hidden" name="token" value="${token}" /> 

在窗體的後處理提交(以HttpServlet#doPost()爲例):

String token = request.getParameter("token"); 
Set<String> tokens = (Set<String>) request.getSession().getAttribute("tokens"); 

if (!tokens.remove(token)) { 
    response.sendError(HttpServletResponse.SC_BAD_REQUEST); 
    return; 
} 

// ...  

當然我假設你jQuery.post()函數都寫在一個不顯眼的方式爲$.post(form.action, form.serialize(), callback),這樣它模擬完全正常同步請求(換句話說,你的表單在JS禁用的情況下工作得很好)。

+0

非常感謝您的回覆。我必須承認我是jquery的新手,所以我不確定這種方法是否適用於我的問題。在我的jsp我有這樣的[code] [/ code]。所以我不清楚如何傳遞你所描述的令牌。謝謝。 – Steve 2012-01-03 20:47:21

+0

哦,你正在使用一個servlet作爲web服務。這實際上不是你問題中提到的「jQuery post」。這只是一個GET請求。什麼時候這被調用?在頁面加載期間只有一次?或多次用戶交互? – BalusC 2012-01-04 13:51:56

+0

對不起,我感到困惑。它實際上是基於javascript定時器(在循環中使用setTimeout方法)調用的。每隔幾秒鐘,就會調用「$ .getJSON ...」根據返回的json對象來更新jsp上的狀態。 – Steve 2012-01-04 21:19:26

0

您可以將安全令牌呈現給您的JSP,並將其包含在您可以驗證它的Servlet的Ajax調用中。這也不能保證Ajax調用是使用瀏覽器和Javascript完成的,但它至少需要有人在進行調用之前從JSP獲取安全令牌。

建議使用類似的概念來減輕CSRF

1

您可以爲您的jsp創建一個隨機cookie,然後將其附加到您的POST表單,並只接受具有正確cookie值的請求。

+0

這實際上比其他提到的解決方案更安全。 Upvoting。 – Perception 2012-01-03 20:38:00

+0

@Perception:請注意,HTTP會話本身已經由「隨機cookie」支持。 – BalusC 2012-01-04 13:52:20

+0

@BalusC - 通常是真的(有些使用URL重寫)。我的主要觀點是cookie會被未經授權的客戶欺騙,而不是嵌入在HTML頁面中的令牌。 – Perception 2012-01-04 14:20:59

0

只是一些語義。請求通常從顯示您的JSP的瀏覽器創建。您不能阻止另一個程序請求您的JSP,並使用您提供的任何信息再次請求。

您可以停止在用戶瀏覽器中查看的另一個網頁執行對您網站的請求。這被稱爲Cross-site request forgery。您可以緩解這種情況。

因此,根據您要阻止的內容,CSRF解決方案可能適合您。您可以從Web服務器中找到預製解決方案。例如,這裏是Tomcat's