2017-06-12 63 views
1

因此,我已经被告知,我已经开始工作的应用程序在跨站点伪造请求(CSFR)方面提供了预防措施, ,但不适用于获取请求。java - 我如何防止跨站点伪造请求

我也被告知,我可以获得原点的来源和目标的来源,比较每个的主机,并根据它们是否匹配或不做什么。到目前为止,我在做了一些研究之后已经有了下面的内容,但我还没有,可以使用一些额外的帮助。我对这个职业很陌生,所以我甚至不确定自己是否在正确的轨道上。

String refererHost = ((HttpServletRequest) request).getHeader("referer"); 

    String targetHost = request.getServerName(); 

    try {  
     refererHost = new URI(refererHost).getHost(); 

     if(!refererHost.equals(targetHost)) 
     { 
      ((HttpServletResponse) response).sendRedirect(((HttpServletRequest)request).getContextPath()+ADMIN_LOGOFF_URL); 
     } 
    } catch (MalformedURIException | NullPointerException e) { 
     request.getRequestDispatcher(ADMIN_LOGOFF_URL).forward(request, response); 
    } 
+2

GET请求不应该根据HTTP规范影响状态。为获取请求防范CSRF的最佳方法是坚持这一点。至于你的代码,你需要描述什么不按照你期望的方式工作。 – Taylor

回答

1

OWASP有建议。您的发布代码(假设这是一个过滤器)是其中的一条建议,因此您处于正确的轨道上。还建议使用令牌 - 希望您可以重复使用已经为POST进行的操作,而无需过多重新分解。

还要检查你的框架(如果有的话)是否提供对CSRF的支持,所以你不必编写自己的代码。

+0

谢谢安德鲁,是的,它是一个过滤器。令牌用于发布请求。截至目前,我相信我有源/目标主机相互比较正确,如果他们不结束用户会话/引导他们到注销屏幕。 – gsnurr3

0

首先是一个命名问题:它的名字是CSRF。 这里我引用的参考网站:

https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)

跨站请求伪造(CSRF)是一款迫使终端用户 以在Web应用程序中,他们 执行不必要的行动的攻击目前已通过认证。 CSRF攻击特别针对 状态变更请求,而不是盗窃数据,因为攻击者没有 方式查看对伪造请求的响应。

状态改变请求是那些可以改变目标站点状态的请求。如果应用程序写得很好,那么GET方法是只读状态,而POST状态应该改变它的状态,应该调用DELETE或UPDATE(所以你必须保护POST方法,但不仅仅是这样)。

让我们举个例子来说明。假设您已登录到您的银行账户。如果您受到攻击,PC上的应用程序可能会调用POST来执行电汇,方法与单击合法应用程序中的按钮相同。

什么是通过这种攻击保护自己的合理方法? 我知道他们中的两个。

第一个是在调用危险页面之前的页面时创建一个随机标记(将其视为您通过GET方法获得的显示请求收件人的屏幕的页面)。这个随机令牌必须保存在用户的会话中,并以隐藏字段的形式出现在页面中。在服务器端执行POST方法时,必须将来自隐藏字段的随机令牌与存储在用户会话中的令牌进行比较。如果他们不匹配,交易必须被拒绝。

第二个包括要求确认,也许通过验证码给用户。

对于更详细的信息,我建议你从这个站点开始: enter link description here 这是每一个开发者一个很好的起点,因为安全是一种高质量的每一个应用程序,预计将有。

相关问题