如何防止跨站点伪造请求



所以,我被告知我已经开始处理的应用程序在发布请求时对跨站点伪造请求 (CSFR) 采取了预防措施,但对于获取请求则没有。

我还被告知,我可以获取原点的来源和原点的目标,比较每个源的主机,并取决于它们是否匹配做某事。截至目前,在进行了一些研究后,我目前有以下内容,但我还没有,可以使用一些额外的帮助。我对这个行业很陌生,所以我甚至不确定我是否走在正确的轨道上。

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);
}

OWASP有建议。 您发布的代码(假设这是一个过滤器)是建议之一,因此您走在正确的轨道上。 还建议使用令牌 - 希望您可以重用已经为 POST 完成的工作,而无需进行太多重构。

还要检查你的框架(如果有的话)是否支持 CSRF,这样你就不必编写自己的代码了。

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

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

跨站点请求伪造 (CSRF) 是一种强制最终用户的攻击 在它们所在的 Web 应用程序上执行不需要的操作 当前已通过身份验证。CSRF 攻击专门针对 状态更改请求,而不是窃取数据,因为攻击者没有 查看对伪造请求的响应的方式。

状态更改请求是可以更改目标站点状态的请求。如果应用程序编写得很好,则GET方法是只读的,而要更改其状态,则应调用POST,DELETE或UPDATE(因此,您必须保护POST方法是正确的,但不仅如此)。

让我们举一个例子来澄清。假设您已登录到您的银行帐户。如果您受到攻击,PC上的应用程序可能会调用POST来执行电汇,就像单击合法应用程序中的按钮一样。

通过这种攻击保护自己的合理方法是什么? 我认识其中两个。

第一个是在调用危险页面之前的页面时创建一个随机令牌(将其视为通过 GET 方法获得的页面,以显示询问收件人的屏幕)。此随机令牌必须保存在用户的会话中,并且还作为隐藏字段显示在页面中。当在服务器端执行 POST 方法时,必须将来自隐藏字段的随机令牌与存储在用户会话中的令牌进行比较。如果它们不匹配,则必须拒绝交易。

第二个包括要求确认,可能是通过验证码给用户。

有关更多详细信息,我建议您从此站点开始: https://owasp.org/对于每个开发人员来说,这是一个很好的起点,因为安全性是每个应用程序都应该具备的质量。

最新更新