Răsfoiți Sursa

task-4611 川北剩余高中危漏洞处理
CORS(跨站资源共享)原始验证失败【原理扫描】漏洞修复

xiexh 9 luni în urmă
părinte
comite
923f363a60

+ 71 - 0
ibps-provider-root/modules/provider-business/src/main/java/com/lc/ibps/filter/CORSFilter.java

@@ -0,0 +1,71 @@
+package com.lc.ibps.filter;
+
+import com.lc.ibps.base.core.util.BeanUtils;
+import com.lc.ibps.base.framework.table.ICommonDao;
+import org.activiti.engine.impl.asyncexecutor.AcquireTimerJobsRunnable;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import javax.servlet.*;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.Map;
+/**
+ * cros跨域访问
+ *
+* */
+@Component
+public class CORSFilter implements Filter {
+    private static Logger log = LoggerFactory.getLogger(CORSFilter.class);
+
+    @Resource
+    private ICommonDao<?> commonDao;
+
+    @Override
+    public void init(FilterConfig filterConfig) throws ServletException {
+
+    }
+
+    @Override
+    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
+        HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;
+        HttpServletResponse response = (HttpServletResponse) servletResponse;
+
+//		response.setHeader("Access-Control-Allow-Origin", "*");
+//      response.setHeader("Access-Control-Max-Age", "3600");
+//		response.setHeader("Access-Control-Allow-Headers", "accept, origin, content-type,x-requested-with,X-Authorization-access_token");
+//		response.setHeader("Access-Control-Allow-Credentials", "true");
+//		response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
+
+        // 1. 获取请求的 Origin(跨域请求会带这个头)
+        String origin = httpRequest.getHeader("Origin");
+
+        // 2. 如果存在 Origin 且不是同源且没有配置白名单,直接拒绝
+        //2. 存在启用的CORS跨域白名单配置
+        String sql = " select id_,biao_ti_,can_shu_zhi_1_ from t_zlcsb where shi_fou_qi_yong_ = 1 and jian_zhi_='%s'";
+        sql = String.format(sql,"CORS");
+        Map<String,Object> corszlcs = commonDao.queryOne(sql);
+        if(BeanUtils.isEmpty(corszlcs)){//不启用
+            filterChain.doFilter(httpRequest, response);
+        }else{
+            String bmd = (String) corszlcs.get("can_shu_zhi_1_");
+            //if (origin != null && !origin.startsWith(httpRequest.getScheme() + "://" + httpRequest.getServerName())) {
+            if (origin != null && !bmd.contains(httpRequest.getServerName())) {
+                log.info("杂类参数表中配置的允许跨域访问的白名单不包括{},请联系管理员添加",httpRequest.getServerName());
+                response.setStatus(HttpServletResponse.SC_FORBIDDEN); // 403
+                response.getWriter().write("CORS not allowed ,please contract administrator");
+                return;
+            }
+            filterChain.doFilter(httpRequest, response);
+        }
+
+    }
+
+    @Override
+    public void destroy() {
+
+    }
+}