我写了这个简单的方法来处理我的简单服务器代理中的CORS。
private void handleCors(HttpServletRequest req, HttpServletResponse resp) {
final String origin = req.getHeader("Origin");
if (Strings.isNullOrEmpty(origin)) {
return;
}
if (!origin.startsWith("http://localhost:")) {
return;
}
resp.setHeader("Access-Control-Allow-Origin", origin);
resp.setHeader("Access-Control-Allow-Credentials", "true");
resp.setHeader("Access-Control-Expose-Headers", "Authorization");
resp.setHeader("Access-Control-Allow-Headers", "Authorization, Content-Type");
}
实际应用程序不需要它,它仅在手动测试时使用(使用ionic serve
)。我想,这是安全的,因为除了原点是localhost之外什么也不做,但比抱歉更安全。
此外,findbugs抱怨response splitting vulnerability。我应该只使用URLEncoder.html#encode还是更多呢?
一般删除空格或者在包含空格的情况下不添加CORS标题吗?
答案 0 :(得分:4)
CORS比JSONP等早期技术更安全,更灵活。
对于GET
请求,WebAPI开箱即用。但是,一旦您开始将其用于POST, PUT or DELETE
操作,然后CORS就会启动并拒绝来自服务器的请求。 CORS会停止所有跨域请求,因此如果您的api正在www.myapi.com
运行且来自www.mywebsite.com
的请求进入,则该请求将被删除。这是一项安全功能,可确保来自未知域的请求无法访问服务器。
如果您使用Web客户端执行ajax调用,那么还需要添加一项内容以进行ajax调用以确保所有浏览器上的CORS字。
$.support.cors = true
crossDomain: true
How to Implement Cross Domain Requests (CORS) in WebAPI, old school?
但是在单行中,如果我们想说那么CORS处理程序是不安全的。 @zapl已经提供了相关信息。
现在我试图给你一些带有一些场景的攻击类型。希望它能为您提供明确的信息。
情景:
攻击者可以通过诱使用户访问攻击者控制的站点,从已将此标头设置为*的Intranet站点窃取数据 在互联网上。
当受害者导航到攻击者控制的网站时,攻击者可以通过受害者的浏览器对其他远程应用程序执行攻击。
<强>方案:强>
- 攻击者可以泄露站点A并托管恶意内容,因为站点B信任站点A通过CORS发送到站点B的数据 请求导致XSS和其他攻击。
- 攻击者可以危害站点B并使用站点A中公开的CORS功能来攻击站点A中的用户。
<强>方案:强>
- 攻击者设置Origin标头或使用受信任的站点A向站点B发送非幂等请求。
- 在查看受信任的站点A时登录到站点B的受害者会导致站点B在他不知情的情况下创建用户帐户
通过CSRF攻击。
<强>方案:强>
- 攻击者设置Origin标头以查看受限制的敏感信息
- 攻击者使用cURL设置自定义原始标题:
curl --header 'origin:http://someserver.com' http://myserver.com:90/demo/origin_spoof.php
这是一个例子。您可以浏览此链接: