[英]what does request.getHeader(“host”) return when multiple legs are configured
为了在Restful服务中实现CSRF安全性,我遵循了OWASP中的文档
OWASP建议采用以下方法来处理CSRF攻击(参考URL: https : //www.owasp.org/index.php/Cross-Site_Request_Forgery_%28CSRF%29_Prevention_Cheat_Sheet )
我们需要执行两个步骤:1.检查标准标头,以验证请求是否来自同一来源。2.检查CSRF令牌
1.检查标准标头,以验证请求是否来自同一来源:建议对照引荐来源对主机进行检查。 由于在请求中更改引荐来源网址和主机标头并不容易,因此我们可以做的第一步是检查引荐来源是否包含主机。
2.检查CSRF令牌
检查同步令牌是实现它的一种方法。 但这适用于有状态的应用程序。 由于我们的应用程序是无状态的,因此OWASP建议传递一个自定义标头,并检查它是否存在于服务器端,我实现了相同的目标。
我试图写下面的代码来检查第一点
String host = "/"+request.getHeader("host")+"/";
String referer = request.getHeader("referer");
if(referer!=null && !referer.contains(host)){
LOGGER.info("referer doesnot contain host");
accessDeniedHandler.handle(request, response, new AccessDeniedException(
"Missing or non-matching CSRF-token"));
return;
}
这在我的本地和测试环境中正常工作,那里只有一只脚。 但是,当我在具有两个分支的stage env中对其进行测试时,引荐来源网址和主机名不同。
主机名的机器名称如下
machin002:8080
但我希望域名像
sample.domain.com
我需要为此主机配置域名吗?
首先,您的推荐人检查不力。
假设主机标头是www.example.com
以提出合法请求。
如果攻击者从他们自己的域evil.example.org
向您发送跨域请求,则可以通过从以下URL发送请求来通过您的检查: https://evil.example.org/?www.example.com
: evil.example.org
。
易受攻击的代码是
referer.contains(host)
引荐来源https://evil.example.org/?www.example.com
为https://evil.example.org/?www.example.com
,您可以看到其中包含www.example.com
。
引用检查是CSRF保护的一种较弱形式,因为它会解析此类错误,有时出于隐私目的,用户会在浏览器中禁用引用。
因此,您应同时检查Origin
和Referer
,但是前者有其自身的问题 。 如果您不关心保护旧的浏览器,那么这是一个很好的CSRF缓解措施。 旧版浏览器也可能会存在其他漏洞,从而使它们不安全,因此您可以辩称使用旧版浏览器的用户仍然是不安全的。
我们的应用程序是无状态的
这就使为什么您首先需要CSRF产生了疑问。
我需要为此主机配置域名吗?
听起来好像您需要一个配置变量,您可以在其中设置在referer
origin
referer
和origin
标题中接收的预期主机。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.