我理解它的方式,如果在foo.com页面上运行的客户端脚本想要从bar.com请求数据,请求必须指定标题Origin: http://foo.com,并且栏必须响应Access-Control-Allow-Origin: http://foo.com.
有什么可以阻止来自网站roh.com的恶意代码简单地欺骗标题Origin: http://foo.com来请求来自bar的页面?
首先,我假设一个后端控制输入以防止XSS漏洞.
在这个答案中 @Les Hazlewood解释了如何在客户端保护JWT.
假设所有通信都有100%TLS - 在登录期间和登录后的所有时间 - 通过基本身份验证使用用户名/密码进行身份验证并在交换中接收JWT是一个有效的用例.这几乎就是OAuth 2的一个流程('密码授权')的工作方式.[...]
您只需设置Authorization标头:
Run Code Online (Sandbox Code Playgroud)Authorization: Bearer <JWT value here>但是,话虽如此,如果您的REST客户端是"不受信任的"(例如支持JavaScript的浏览器),我甚至不会这样做:HTTP响应中可通过JavaScript访问的任何值 - 基本上任何标头值或响应正文值 - 可以通过MITM XSS攻击嗅探和截获.
最好将JWT值存储在仅安全的纯http cookie中(cookie config:setSecure(true),setHttpOnly(true)).这可以保证浏览器:
- 只通过TLS连接传输cookie,
- 永远不要将cookie值用于JavaScript代码.
这种方法几乎是您为最佳实践安全所需要做的一切.最后一件事是确保您对每个HTTP请求都有CSRF保护,以确保启动对您站点的请求的外部域无法正常运行.
最简单的方法是使用随机值(例如UUID)设置仅安全(但不是仅限http)cookie.
我不明白为什么我们需要具有随机值的cookie来确保启动对您站点的请求的外部域无法运行.使用同源策略时,这不是免费的吗?
来自OWASP:
检查Origin Header
Origin HTTP Header标准是作为防御CSRF和其他跨域攻击的方法而引入的.与引用者不同,源将出现在源自HTTPS URL的HTTP请求中.
如果存在原始标头,则应检查其是否一致.
我知道OWASP本身的一般建议是同步器令牌模式,但我看不出剩下的漏洞是什么:
更新1: 同源策略仅适用于XMLHTTPRequest,因此恶意站点可以轻松地生成表单POST请求,这将破坏我的安全性.需要显式的原始标头检查.等式将是:
我正在尝试连接到外部Web套接字服务器,这不是我自己运行的.我想从localhost javascript文件连接到它,因此origin头具有null值.
我知道这是针对跨站点伪造的措施.但是,因为我在localhost上,所以我应该能够通过让Chrome发送自定义的Origin标头来伪装它.
可能吗?(如果我需要延期,那很好)
如果没有,实现上述目标的最佳选择是什么?谢谢.
所以我知道有很多关于CSRF的问题(因为我已经读过其中的一些),但有一点我还是不明白.让我们假设以下情况:
我在我的服务器上登录(带有cookie),其中有一个带有"删除我的帐户"按钮的页面.哪个我不想按.
我访问了一个黑客的服务器:
一个.我的浏览器请求'bad.html',它包含JS,并定义了回调函数.它还有一个类似的脚本:(因此避免了同源策略问题)
var s = document.createElement('script');
s.src = 'url to "deleteAccountPage" of my server?'
s.src += 'callback=hackerCallback';
s.type = 'text/javascript';
document.body.appendChild(s);
Run Code Online (Sandbox Code Playgroud)
湾 脚本被"追加"浏览器将加载页面然后调用hackerCallback传递页面HTML文本作为参数.
C.使用此HTML,回调可以在那里解析令牌.
hackerCallback现在有令牌,在"deleteMyAccount"页面上向我的服务器发送Ajax请求.
我的帐户现已删除,因为令牌,Cookie甚至浏览器跟踪都与服务器注册的匹配.
你怎么避免这种行为?我已阅读过只允许在我的服务器上使用某些标题的内容.这会缩短我服务器上的所有跨域请求,但是根据这个链接(http://blog.alexmaccaw.com/jswebapps-csrf)这还不够......(我完全相信)
Thansk帮助Seba-1511
我正在开发Web应用程序,并要求VAPT在发布前对其进行测试。
然后,我下载了Vega,并迅速扫描了我的Web应用程序,并遇到了VAPT问题,如下所示:
Vega检测到资源已设置了不安全的跨域资源共享(CORS)访问控制。CORS提供了允许服务器限制跨站点请求对某些受信任域的资源访问的机制。通过将“ Access-Control-Allow-Origin”响应标头的值设置为通配符值,所讨论的服务器已允许来自任何来源的资源。这带来了安全风险,因为任何站点都可以发出访问资源的请求,而不论其来源如何。
然后,我开始寻找解决方案来解决它,并发现这篇文章并filter按照答案中的建议实施了以下内容:
@Component
public class CORSFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
HttpServletRequest request = (HttpServletRequest) req;
response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
response.setHeader("Access-Control-Allow-Methods",
"POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
chain.doFilter(request, response);
}
public void destroy() {
}
}
Run Code Online (Sandbox Code Playgroud)
现在,当我再次针对Webapp扫描Vega时,它不再列出相同的问题,我相信这使我的Webapp免受了CSRF攻击。
现在,在阅读了这篇文章之后,我正在考虑如何request.getHeader("Origin")防止from …
我已使用 Django 通道(v. 2.1.5)在 Django(v. 2.0)驱动的网站上成功创建了一个 websocket。
一切都很好,但我想知道 CSRF 令牌怎么样。如果是 websocket 的话需要吗?文档说它足以用来OriginValidator防止此类线程,但我想确保这一点。我的意思是,CSRF 代币发生了什么?我是否只是通过安全通道发送数据而没有它,后端会自动检查所有内容?如果是这样那为什么呢?为什么简单的视图不能做到这一点?
我知道这是一个相当悬而未决的问题,但我无法找到任何具体的解释,如果有人有一个我会非常感激。