这是在 Java 中创建允许任何来源的 CORS 过滤器的好方法吗?
Is this a good way to create a CORS filter in Java that allow any origin?
我需要在 java 中做一个 cors 过滤器,我想允许任何来源、headers 和方法,我创建了以下过滤器:
@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class CorsFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
resp.setHeader("Access-Control-Allow-Origin", req.getHeader("Origin"));
resp.setHeader("Access-Control-Allow-Credentials", "true");
if("OPTIONS".equals(req.getMethod())) {
resp.setHeader("Access-Control-Allow-Methods", req.getHeader("Access-Control-Request-Method"));
resp.setHeader("Access-Control-Allow-Headers", req.getHeader("Access-Control-Request-Headers"));
resp.setHeader("Access-Control-Max-Age", "3600");
resp.setStatus(HttpServletResponse.SC_OK);
} else {
chain.doFilter(request, response);
}
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void destroy() {
}
}
我使用 *
允许任何来源,header 和方法,但我需要从浏览器发送 Cookie,并且来源 header 是 *
,浏览器在控制台中显示以下消息
The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'.
所以我使用请求中的 "Origin"
header 作为 "Access-Control-Allow-Origin";
的值
如果我同时收到来自多个来源的请求,这种方法是否有效?
通过接受任何来源,你基本上打破了 CORS 的想法,你让每个人都可以使用你的服务(好吧,你有授权,但 DOS 攻击也是可能的)。
CORS 的想法是让您的前端只与某些特定的(您的)后端通信。
该漏洞针对的情况是有人会注入一些恶意 javascript 想要使用一些丑陋的后端,或者一些外国 javascript 想要使用您的后端服务。
希望对您有所帮助,
干杯
是的,假设请求中有 Origin
header,这将起作用。要获得更全面的处理方法,我建议您查看 Spring 的 CorsConfiguration.java:
@Nullable
public String checkOrigin(@Nullable String requestOrigin) {
if (!StringUtils.hasText(requestOrigin)) {
return null;
}
if (ObjectUtils.isEmpty(this.allowedOrigins)) {
return null;
}
if (this.allowedOrigins.contains(ALL)) {
if (this.allowCredentials != Boolean.TRUE) {
return ALL;
}
else {
return requestOrigin;
}
}
for (String allowedOrigin : this.allowedOrigins) {
if (requestOrigin.equalsIgnoreCase(allowedOrigin)) {
return requestOrigin;
}
}
return null;
}
我需要在 java 中做一个 cors 过滤器,我想允许任何来源、headers 和方法,我创建了以下过滤器:
@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class CorsFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
resp.setHeader("Access-Control-Allow-Origin", req.getHeader("Origin"));
resp.setHeader("Access-Control-Allow-Credentials", "true");
if("OPTIONS".equals(req.getMethod())) {
resp.setHeader("Access-Control-Allow-Methods", req.getHeader("Access-Control-Request-Method"));
resp.setHeader("Access-Control-Allow-Headers", req.getHeader("Access-Control-Request-Headers"));
resp.setHeader("Access-Control-Max-Age", "3600");
resp.setStatus(HttpServletResponse.SC_OK);
} else {
chain.doFilter(request, response);
}
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void destroy() {
}
}
我使用 *
允许任何来源,header 和方法,但我需要从浏览器发送 Cookie,并且来源 header 是 *
,浏览器在控制台中显示以下消息
The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'.
所以我使用请求中的 "Origin"
header 作为 "Access-Control-Allow-Origin";
如果我同时收到来自多个来源的请求,这种方法是否有效?
通过接受任何来源,你基本上打破了 CORS 的想法,你让每个人都可以使用你的服务(好吧,你有授权,但 DOS 攻击也是可能的)。
CORS 的想法是让您的前端只与某些特定的(您的)后端通信。
该漏洞针对的情况是有人会注入一些恶意 javascript 想要使用一些丑陋的后端,或者一些外国 javascript 想要使用您的后端服务。
希望对您有所帮助, 干杯
是的,假设请求中有 Origin
header,这将起作用。要获得更全面的处理方法,我建议您查看 Spring 的 CorsConfiguration.java:
@Nullable
public String checkOrigin(@Nullable String requestOrigin) {
if (!StringUtils.hasText(requestOrigin)) {
return null;
}
if (ObjectUtils.isEmpty(this.allowedOrigins)) {
return null;
}
if (this.allowedOrigins.contains(ALL)) {
if (this.allowCredentials != Boolean.TRUE) {
return ALL;
}
else {
return requestOrigin;
}
}
for (String allowedOrigin : this.allowedOrigins) {
if (requestOrigin.equalsIgnoreCase(allowedOrigin)) {
return requestOrigin;
}
}
return null;
}