Skip to content

Commit 63214dd

Browse files
authored
Merge pull request #91 from WinterChenS/fix/Incorrect-Access-Control-vulnerability
fix: invorrect access control vuInerability
2 parents 8c0241d + c4b8c7b commit 63214dd

File tree

1 file changed

+15
-10
lines changed

1 file changed

+15
-10
lines changed

src/main/java/cn/luischen/interceptor/BaseInterceptor.java

+15-10
Original file line numberDiff line numberDiff line change
@@ -54,42 +54,46 @@ public boolean preHandle(HttpServletRequest request, HttpServletResponse respons
5454
LOGGE.info("UserAgent: {}", request.getHeader(USER_AGENT));
5555
LOGGE.info("用户访问地址: {}, 来路地址: {}", uri, IPKit.getIpAddrByRequest(request));
5656

57-
// 请求拦截处理
57+
// 获取当前登录用户
5858
UserDomain user = TaleUtils.getLoginUser(request);
59-
if (null == user) {
59+
if (user == null) {
6060
Integer uid = TaleUtils.getCookieUid(request);
61-
if (null != uid) {
62-
// Cookie 可以伪造,因此要注意
61+
if (uid != null) {
6362
user = userService.getUserInfoById(uid);
6463
request.getSession().setAttribute(WebConst.LOGIN_SESSION_KEY, user);
6564
}
6665
}
6766

68-
// 需要认证的路径,不包括静态资源和登录页面
67+
// 权限控制
6968
if (uri.startsWith("/admin")
7069
&& !uri.startsWith("/admin/login")
71-
&& null == user
70+
&& user == null
7271
&& !isStaticResource(uri)) {
7372

7473
response.sendRedirect(request.getContextPath() + "/admin/login");
7574
return false;
7675
}
7776

78-
// 设置 CSRF token,仅对敏感操作进行 CSRF 校验
77+
// 检查权限:对于敏感操作路径(如删除),确保用户是管理员
78+
if (isSensitiveOperation(uri) && user == null) {
79+
response.sendError(HttpServletResponse.SC_FORBIDDEN, "Unauthorized access");
80+
return false;
81+
}
82+
83+
// 设置 CSRF token,仅对敏感操作进行校验
7984
if ("GET".equalsIgnoreCase(request.getMethod())) {
8085
String csrfToken = UUID.UU64();
81-
// 默认存储30分钟
8286
cache.hset(Types.CSRF_TOKEN.getType(), csrfToken, uri, 30 * 60);
8387
request.setAttribute("_csrf_token", csrfToken);
84-
} else if ("POST".equalsIgnoreCase(request.getMethod()) && isSensitiveOperation(uri)) {
88+
} else if ("POST".equalsIgnoreCase(request.getMethod()) && isSensitiveOperation(uri) && user == null) {
8589
// 检查 POST 请求的 CSRF token
8690
String csrfToken = request.getParameter("_csrf_token");
8791
String expectedUri = cache.hget(Types.CSRF_TOKEN.getType(), csrfToken);
8892
if (expectedUri == null || !expectedUri.equals(uri)) {
8993
response.sendError(HttpServletResponse.SC_FORBIDDEN, "CSRF token invalid or expired.");
9094
return false;
9195
}
92-
cache.hdel(Types.CSRF_TOKEN.getType(), csrfToken); // Token 仅使用一次
96+
cache.hdel(Types.CSRF_TOKEN.getType(), csrfToken);
9397
}
9498

9599
return true;
@@ -113,6 +117,7 @@ private boolean isSensitiveOperation(String uri) {
113117

114118

115119

120+
116121
@Override
117122
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
118123
OptionsDomain ov = optionService.getOptionByName("site_record");

0 commit comments

Comments
 (0)