【发布时间】:2017-01-01 19:36:04
【问题描述】:
为了在 Restful 服务中实现 CSRF 安全性,我遵循了 OWASP 中的文档
OWASP 建议使用以下方法来处理 CSRF 攻击(参考网址:https://www.owasp.org/index.php/Cross-Site_Request_Forgery_%28CSRF%29_Prevention_Cheat_Sheet)
我们需要遵循两个步骤: 1.检查标准头以验证请求是同源的 2. 并检查 CSRF 令牌
1.检查标准标头以验证请求是否来自同一来源: 建议对照推荐人检查主机。由于在请求中更改referer和host标头并不容易,因此检查Referer是否包含Host是我们可以做的第一个检查,我已经处理了。
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;
}
这在我只有一条腿的本地和测试环境中正常工作。但是当我在有两条腿的舞台环境中测试它时,Referer 和主机名是不同的。
主机名与机器名类似
machin002:8080
但我期待像
这样的域名sample.domain.com
我需要为这个主机配置域名吗?
【问题讨论】:
标签: java dns csrf servlet-filters request-headers