通用修复建议:
1.具体指定允许的来源: 在CORS配置中,应明确指定允许访问资源的来源,而不是使用通配符*。
2.携带身份验证信息时要求具体来源: 如果资源需要身份验证信息,不应该允许所有来源访问,而是明确指定允许的来源,并且在Access-Control-Allow-Credentials头部设置为true。
3.限制允许的方法和标头: 通过Access-Control-Allow-Methods和Access-Control-Allow-Headers头部,限制允许的HTTP方法和HTTP标头,以减少攻击面。
Nginx设置CORS实现跨域访问
默认情况下Ajax在请求跨域的时候会被阻止,如调用API/前端库字体等不方便,可通过如下设置来实现跨域访问。
Nginx配置
在nginx server段内添加如下代码,并重启Nginx即可:
location /{
add_header 'Access-Control-Allow-Origin' ip地址;
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Headers' 'Authorization,Content-Type,Accept,Origin,User-Agent,DNT,Cache-Control,X-Mx-ReqToken,X-Requested-With';
add_header 'Access-Control-Allow-Methods' 'GET,POST';
}
注意:add_header 'Access-Control-Allow-Origin' ip地址 需要进行定ip配置。
参考代码:
// 跨域请求前设置正确的CORS头
response.setHeader("Access-Control-Allow-Origin", "http://example.com");
response.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
response.setHeader("Access-Control-Allow-Headers", "X-Requested-With,Content-Type");
// 服务端校验referer头并设置允许的origin
if (request.getHeader("referer") != null &&
request.getHeader("referer").contains("http://example.com")) {
response.setHeader("Access-Control-Allow-Origin", "http://example.com");
} else {
response.sendError(403); // Forbidden
}
// 前端通过AJAX发起跨域请求
var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://example.org/cors-endpoint');
xhr.setRequestHeader('Origin', 'http://example.com');
xhr.send();
// 服务端检验origin头并做出响应
if (request.getHeader("Origin") != null &&
request.getHeader("Origin").equals("http://example.com")) {
response.setHeader("Access-Control-Allow-Origin", "http://example.com");
} else {
response.sendError(403);
}
// 使用CORS middleware对所有请求设置默认CORS头
app.use((req, res, next) => {
res.setHeader('Access-Control-Allow-Origin', 'http://example.com');
res.setHeader(
'Access-Control-Allow-Methods',
'GET, POST, OPTIONS, PUT, PATCH, DELETE'
);
res.setHeader(
'Access-Control-Allow-Headers',
'X-Requested-With,content-type'
);
next();
});
在Java中,可以通过使用Spring Framework来配置CORS的策略。以下是一个简单的修复示例:
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api")
public class MyController {
@CrossOrigin(origins = "https://trusteddomain.com", allowCredentials = "true")
@GetMapping("/secured-resource")
public String getSecuredResource() {
// Logic to handle the secured resource
return "This is a secured resource";
}
}
在上述示例中,@CrossOrigin注解用于配置CORS策略。origins参数指定了允许的来源,allowCredentials参数设置为true表示允许携带身份验证信息。请根据实际需求进行调整,确保CORS策略严格限制访问资源的来源。