JAVA:Web安全防御
目录
一、Web安全基础与常见威胁
-
OWASP Top 10核心漏洞解析 • SQL注入(SQLi)、跨站脚本(XSS)、跨站请求伪造(CSRF) • 不安全的反序列化、敏感数据泄露
-
Java后端常见攻击场景 • 通过
HttpServletRequest
的请求参数篡改 • JWT令牌伪造与越权访问 -
安全防御目标 • 代码层防御(输入校验、输出编码) • 架构层防护(HTTPS、权限控制)
二、认证与授权安全实战
-
安全的用户认证方案 • 密码存储:BCrypt算法与盐值加密(Spring Security实现) • 多因素认证(MFA):整合短信/邮箱验证码
-
OAuth 2.0与JWT安全实践 • 授权码模式防钓鱼攻击 • JWT签名算法选择(HS256 vs RS256)、令牌刷新机制
-
细粒度权限控制 • Spring Security的RBAC实现(角色继承、动态权限) • 接口级权限注解(
@PreAuthorize("hasRole('ADMIN')")
)
三、输入校验与数据安全
-
请求参数安全处理 • 使用Hibernate Validator进行参数校验(
@NotBlank
,@Pattern
) • 防御SQL注入:MyBatis的#{}
占位符 vs${}
拼接风险 -
XSS防御与输出编码 • Thymeleaf自动转义(
th:text
vsth:utext
) • 自定义HttpServletResponseWrapper过滤敏感数据 -
文件上传安全 • 限制文件类型、大小、重命名存储 • 病毒扫描(集成ClamAV)
四、会话管理与通信安全
-
Session安全防护 • Session固定攻击防御(登录后重置Session ID) • Cookie属性设置(Secure, HttpOnly, SameSite)
-
HTTPS配置最佳实践 • 免费证书申请(Let's Encrypt) • Spring Boot中强制HTTPS跳转
-
CSRF防御方案 • Spring Security的CSRF Token机制 • 前后端分离架构下的CSRF防御(双重Cookie验证)
五、API安全与微服务防护
-
API接口安全设计 • 接口版本控制、限流(Rate Limiting) • 使用Swagger/OAS3生成安全的API文档
-
微服务安全架构 • Spring Cloud Gateway的鉴权过滤(JWT解析) • 服务间通信安全(mTLS双向认证)
-
第三方API集成风险 • 密钥管理(Vault或KMS动态获取) • 请求签名(HMAC-SHA256)
六、日志监控与应急响应
-
安全日志记录 • 敏感操作日志(登录、支付)的审计追踪 • 使用Log4j2/SLF4J标记高风险事件
-
异常监控与告警 • 集成Prometheus监控异常请求(如频繁401错误) • 邮件/钉钉通知(通过Spring Boot Actuator)
-
漏洞应急响应 • 热修复(Arthas动态修改代码) • 快速回滚(Docker+K8s版本管理)
七、面试高频安全题解析
-
经典面试题 • 如何防止JWT令牌被盗用? • 解释Spring Security的过滤器链机制
-
场景设计题 • 设计一个安全的用户注册/登录流程 • 如何优化一个存在SQL注入漏洞的老系统?
-
陷阱题 • 为什么说
@PreAuthorize
注解不能完全替代权限校验? • HTTPS能否防御CSRF攻击?为什么?
一、Web安全基础与常见威胁
1. OWASP Top 10核心漏洞解析
1.1 SQL注入(SQLi)
• 攻击原理:攻击者通过构造恶意输入参数,篡改SQL语句逻辑,实现非授权数据访问或破坏。 • Java代码示例(漏洞场景):
// 错误示例:直接拼接SQL语句 String sql = "SELECT * FROM users WHERE username = '" + request.getParameter("username") + "'"; jdbcTemplate.query(sql, ...);
• 防御方案: • 预编译语句(PreparedStatement): java String sql = "SELECT * FROM users WHERE username = ?"; jdbcTemplate.query(sql, new Object[]{request.getParameter("username")}, ...);
• ORM框架防御:使用JPA/Hibernate的命名参数查询: java @Query("SELECT u FROM User u WHERE u.username = :username") User findByUsername(@Param("username") String username);
1.2 跨站脚本(XSS)
• 攻击原理:用户输入未过滤,恶意脚本被浏览器执行(如窃取Cookie)。 • Java代码示例(漏洞场景):
// 错误示例:直接输出用户输入到HTML model.addAttribute("message", request.getParameter("content"));
<!-- Thymeleaf模板中直接渲染 --> <div th:text="${message}"></div>
• 防御方案: • 输出编码:Thymeleaf自动转义(默认启用): html <!-- 安全写法 --> <div th:text="${message}"></div> <!-- 危险写法(避免使用) --> <div th:utext="${message}"></div>
• 自定义过滤器:对特殊字符(<
, >
, &
)进行转义: java String safeOutput = StringEscapeUtils.escapeHtml4(rawInput);
1.3 跨站请求伪造(CSRF)
• 攻击原理:诱导用户点击恶意链接,以用户身份执行非授权操作(如转账)。 • 防御方案: • Spring Security默认防护:自动生成CSRF Token并校验。 java // 启用CSRF防护(默认开启) http.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());
• 前端集成:在表单或Header中携带Token: html <input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}"/>
1.4 不安全的反序列化
• 攻击原理:恶意序列化数据触发远程代码执行(如Apache Commons Collections漏洞)。 • 防御方案: • 白名单校验:使用Jackson的@JsonTypeInfo
限制反序列化类: java @JsonTypeInfo(use = Id.NAME, property = "type") @JsonSubTypes({@Type(value = SafeClass.class, name = "safe")}) public abstract class BaseClass {}
• JVM参数限制:禁止危险类的反序列化: bash -Djdk.serialFilter=!org.apache.commons.collections4.*
1.5 敏感数据泄露
• 攻击场景: • 日志中打印用户密码(logger.info("User password: {}", password)
)。 • API响应中暴露数据库字段(如返回User
实体所有属性)。 • 防御方案: • DTO隔离敏感字段: java public class UserDto { private String username; // 不包含password字段 }
• Spring Boot配置:屏蔽敏感信息的日志输出: yaml logging: level: org.springframework: INFO pattern: console: "%d %-5level [%thread] %logger{36} - %msg%n" filter: deny: password,secret
2. Java后端常见攻击场景
2.1 通过HttpServletRequest
的请求参数篡改
• 场景示例:用户修改URL中的id
参数越权访问他人数据:
GET /api/orders/123 → 篡改为 GET /api/orders/456
• 防御方案: • 权限校验:在Service层验证数据归属: java public Order getOrder(Long orderId) { Order order = orderRepository.findById(orderId); if (!order.getUserId().equals(currentUserId())) { throw new AccessDeniedException("无权访问"); } return order; }
2.2 JWT令牌伪造与越权访问
• 攻击原理:窃取JWT令牌或伪造签名访问他人数据。 • 防御方案: • 强签名算法:使用RS256(非对称加密)而非HS256(对称加密): yaml # application.yml jwt: algorithm: RS256 public-key: classpath:public_key.pem
• 令牌失效机制:维护令牌黑名单(Redis记录失效Token): java // 登出时加入黑名单 redisTemplate.opsForValue().set("jwt:invalid:" + token, "1", 5, TimeUnit.MINUTES); // 校验时检查黑名单 if (redisTemplate.hasKey("jwt:invalid:" + token)) { throw new InvalidTokenException("Token已失效"); }
3. 安全防御目标
3.1 代码层防御
• 输入校验:在Controller层拦截非法参数:
@PostMapping("/users") public ResponseEntity<?> createUser(@Valid @RequestBody UserCreateRequest request) { // 校验通过后才执行业务逻辑 return ResponseEntity.ok(userService.create(request)); }
• 输出编码:全局配置JSON序列化转义:
@Bean public Jackson2ObjectMapperBuilderCustomizer jsonEscape() { return builder -> builder.featuresToEnable(JsonWriteFeature.ESCAPE_NON_ASCII); }
3.2 架构层防护
• HTTPS强制启用:
@Configuration public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.requiresChannel().anyRequest().requiresSecure(); } }
• 权限控制:基于角色的接口访问控制:
@PreAuthorize("hasRole('ADMIN')") @DeleteMapping("/users/{id}") public void deleteUser(@PathVariable Long id) { userService.delete(id); }
总结
• 漏洞本质:信任未经验证的外部输入。 • 防御核心: • 不信任原则:所有输入均需校验,所有输出均需编码。 • 最小权限原则:用户只能访问必需资源。 • 开发习惯:使用安全框架(如Spring Security)而非手动造轮子,定期依赖扫描(Maven Dependency Check)。
二、认证与授权安全实战
1. 安全的用户认证方案
1.1 密码存储:BCrypt算法与盐值加密
• 为何选择BCrypt: • 抗彩虹表攻击:BCrypt自动生成随机盐值(Salt),相同密码哈希值不同。 • 计算成本可调:通过strength
参数控制哈希迭代次数(默认10,约100ms)。 • Spring Security集成:
@Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(12); // 强度参数12(2^12次迭代) } }
• 密码存储示例:
// 用户注册时加密密码 String rawPassword = "user123"; String encodedPassword = passwordEncoder().encode(rawPassword); userRepository.save(new User(username, encodedPassword));
1.2 多因素认证(MFA)整合
• 短信验证码流程:
-
用户输入用户名密码完成初步认证。
-
生成6位随机码存入Redis(5分钟过期)。
String code = String.format("%06d", new Random().nextInt(999999)); redisTemplate.opsForValue().set("mfa:" + username, code, 5, TimeUnit.MINUTES);
-
调用短信服务商API发送验证码到用户手机。
-
用户提交验证码,系统校验通过后发放Token。
• Spring Security扩展点:
public class MfaAuthenticationFilter extends UsernamePasswordAuthenticationFilter { @Override public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException { // 验证短信验证码逻辑 String code = request.getParameter("code"); String cachedCode = redisTemplate.opsForValue().get("mfa:" + username); if (!code.equals(cachedCode)) { throw new BadCredentialsException("验证码错误"); } return super.attemptAuthentication(request, response); } }
2. OAuth 2.0与JWT安全实践
2.1 授权码模式防钓鱼攻击
• PKCE(Proof Key for Code Exchange)扩展: • 流程: 1. 客户端生成code_verifier
(随机字符串)和code_challenge
(其SHA256哈希)。 2. 授权请求携带code_challenge
。 3. 令牌请求时提交code_verifier
,服务端验证哈希一致性。 • 防御场景:防止授权码被中间人劫持后用于获取Token。 • Spring Security配置:
@Bean public AuthorizationServerSettings authorizationServerSettings() { return AuthorizationServerSettings.builder() .pkceRequired(true) // 强制启用PKCE .build(); }
2.2 JWT安全配置
• 签名算法选择:
算法 | 类型 | 安全性建议 |
---|---|---|
HS256 | 对称加密 | 仅限内部服务 |
RS256 | 非对称加密 | 公开API(推荐) |
• JWT密钥管理: |
// 使用RSA密钥对(2048位) @Bean public KeyPair keyPair() { return KeyPairGenerator.getInstance("RSA").generateKeyPair(); } @Bean public JwtDecoder jwtDecoder(KeyPair keyPair) { return NimbusJwtDecoder.withPublicKey((RSAPublicKey) keyPair.getPublic()).build(); }
• 令牌刷新机制: • Refresh Token有效期:设置较长周期(如7天),但需绑定设备指纹。 • 刷新接口防护: java @PostMapping("/token/refresh") public ResponseEntity<JwtResponse> refreshToken(@RequestParam String refreshToken) { // 校验refreshToken有效性及设备指纹 if (!deviceService.validate(refreshToken, currentDeviceId)) { throw new InvalidTokenException("无效的Refresh Token"); } // 生成新Access Token return ResponseEntity.ok(jwtService.refreshToken(refreshToken)); }
3. 细粒度权限控制
3.1 RBAC与动态权限实现
• 数据库表设计:
CREATE TABLE role ( id BIGINT PRIMARY KEY, name VARCHAR(20) NOT NULL UNIQUE ); CREATE TABLE permission ( id BIGINT PRIMARY KEY, resource VARCHAR(50) NOT NULL, action VARCHAR(10) NOT NULL -- 如read, write ); CREATE TABLE role_permission ( role_id BIGINT, permission_id BIGINT, PRIMARY KEY (role_id, permission_id) );
• 动态权限加载:
@Component public class DynamicPermissionService implements PermissionEvaluator { @Override public boolean hasPermission(Authentication auth, Object target, Object permission) { // 从数据库查询用户权限 List<String> permissions = permissionService.getPermissions(auth.getName()); return permissions.contains(permission.toString()); } }
3.2 接口级权限控制
• 注解使用示例:
@PreAuthorize("hasPermission(#id, 'USER', 'READ')") @GetMapping("/users/{id}") public User getUser(@PathVariable Long id) { return userService.findById(id); } @PreAuthorize("hasRole('ADMIN') or hasPermission(#request, 'WRITE')") @PostMapping("/users") public void createUser(@RequestBody UserCreateRequest request) { userService.create(request); }
• 角色继承配置:
@Bean public RoleHierarchy roleHierarchy() { RoleHierarchyImpl hierarchy = new RoleHierarchyImpl(); hierarchy.setHierarchy("ROLE_ADMIN > ROLE_STAFF \n ROLE_STAFF > ROLE_USER"); return hierarchy; }
总结与面试要点
• 高频面试题: • 如何防止JWT令牌被盗用:绑定IP/设备指纹、设置短有效期、使用Refresh Token轮换。 • OAuth2授权码模式流程:客户端重定向→用户授权→授权码→换Token。 • 安全红线: • 禁止在URL中传递敏感参数(如response_type=token
隐式模式)。 • 生产环境禁用ROLE_ANONYMOUS
接口。
代码规范检查项: • 使用@PreAuthorize
而非手动校验权限。 • 所有API文档(Swagger)标记所需权限。
通过分层权限控制与安全协议加固,构建可扩展、易维护的认证授权体系。
三、输入校验与数据安全
1. 请求参数安全处理
1.1 Hibernate Validator参数校验实战
• 常用校验注解:
注解 | 功能 | 示例 |
---|---|---|
@NotBlank | 非空且至少一个非空格字符 | @NotBlank String username |
@Pattern | 正则表达式校验 | @Pattern(regexp = "^1[3-9]\\d{9}$") String phone |
@Size | 字符串/集合长度限制 | @Size(min=6, max=20) String password |
@Email | 邮箱格式校验 | @Email String email |
• 全局异常处理:统一返回校验失败信息
@RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(MethodArgumentNotValidException.class) public ResponseEntity<?> handleValidationException(MethodArgumentNotValidException ex) { Map<String, String> errors = new HashMap<>(); ex.getBindingResult().getFieldErrors().forEach(error -> errors.put(error.getField(), error.getDefaultMessage()) ); return ResponseEntity.badRequest().body(errors); } }
1.2 MyBatis SQL注入防御
• #{}
与${}
的区别:
占位符 | 处理方式 | 安全性 | 适用场景 |
---|---|---|---|
#{} | 预编译参数化查询 | 高 | 动态条件值 |
${} | 直接拼接SQL片段 | 低(需严格校验) | 动态表名/排序字段 |
• 安全示例:
<!-- 安全写法(使用#{}) --> <select id="findUser" resultType="User"> SELECT * FROM users WHERE username = #{username} </select> <!-- 危险写法(避免使用${}) --> <select id="findUser" resultType="User"> SELECT * FROM users WHERE username = '${username}' </select>
• 动态表名处理:若必须使用${}
,需白名单过滤:
public void checkTableName(String tableName) { if (!Arrays.asList("users", "orders").contains(tableName)) { throw new IllegalArgumentException("非法表名"); } }
2. XSS防御与输出编码
2.1 Thymeleaf自动转义机制
• 安全输出:
<!-- 自动转义特殊字符 --> <div th:text="${userInput}"></div> <!-- 危险:直接渲染原始HTML --> <div th:utext="${userInput}"></div>
• 禁用部分标签:防止富文本XSS
@Bean public SpringTemplateEngine templateEngine() { SpringTemplateEngine engine = new SpringTemplateEngine(); engine.setEnableSpringELCompiler(true); // 配置HTML过滤器,仅允许安全标签 Set<String> allowedTags = new HashSet<>(Arrays.asList("div", "span", "p")); engine.addTemplateResolver(new HtmlFilterTemplateResolver(allowedTags)); return engine; }
2.2 敏感数据响应过滤
• 自定义HttpServletResponseWrapper:
public class SensitiveDataResponseWrapper extends HttpServletResponseWrapper { public SensitiveDataResponseWrapper(HttpServletResponse response) { super(response); } @Override public PrintWriter getWriter() throws IOException { return new PrintWriter(new OutputStreamWriter(getOutputStream())) { @Override public void write(String s) { // 过滤身份证号(示例) String filtered = s.replaceAll("\\d{17}[\\dXx]", "***"); super.write(filtered); } }; } }
• 注册过滤器:
@Bean public FilterRegistrationBean<SensitiveDataFilter> sensitiveDataFilter() { FilterRegistrationBean<SensitiveDataFilter> bean = new FilterRegistrationBean<>(); bean.setFilter(new SensitiveDataFilter()); bean.addUrlPatterns("/*"); return bean; }
3. 文件上传安全实战
3.1 基础防护策略
• Spring Boot配置限制:
spring: servlet: multipart: max-file-size: 10MB # 单文件最大10MB max-request-size: 100MB # 总请求最大100MB
• 文件类型白名单:
public boolean isAllowedFileType(String filename) { String extension = FilenameUtils.getExtension(filename).toLowerCase(); return Arrays.asList("jpg", "png", "pdf").contains(extension); } @PostMapping("/upload") public String uploadFile(@RequestParam("file") MultipartFile file) { if (!isAllowedFileType(file.getOriginalFilename())) { throw new InvalidFileTypeException("不支持的文件类型"); } // 保存文件逻辑 }
3.2 病毒扫描集成(ClamAV)
• ClamAV客户端配置:
@Bean public ClamAVClient clamAVClient() { return new ClamAVClient("clamav-server", 3310); } public boolean scanFile(byte[] fileData) { try { ClamAVClient client = clamAVClient(); return client.scan(fileData).isClean(); } catch (IOException e) { throw new VirusScanException("病毒扫描失败"); } }
• 上传流程整合:
@PostMapping("/upload-safe") public ResponseEntity<?> uploadSafeFile(@RequestParam("file") MultipartFile file) { if (!scanFile(file.getBytes())) { throw new VirusDetectedException("文件包含恶意代码"); } // 保存安全文件 }
总结与最佳实践
• 输入校验铁律: • 前端非信任:即使前端已校验,后端必须二次验证。 • 边界防御:在数据进入系统时(Controller层)立即校验。 • XSS防御层级:
-
输入过滤:拒绝含
<script>
标签的内容。 -
输出编码:模板引擎自动转义。
-
CSP策略:
Content-Security-Policy: default-src 'self'
。 • 文件安全原则:
• **隔离存储**:上传文件存放到非Web根目录。 • **权限控制**:设置文件系统权限(如Linux的`chmod 644`)。
代码自查清单: • 所有用户输入是否经过校验? • 所有输出到页面的数据是否经过编码? • 文件上传接口是否限制类型、扫描病毒?
通过分层防御策略,构建从输入到输出的完整安全链条。
四、会话管理与通信安全
1. Session安全防护
1.1 Session固定攻击防御
• 攻击原理:攻击者诱导用户使用已知的Session ID登录,从而劫持用户会话。 • 防御方案:用户认证成功后立即重置Session ID。
@PostMapping("/login") public String login(HttpServletRequest request) { // 认证成功后使旧Session失效 request.getSession().invalidate(); HttpSession newSession = request.getSession(true); // 存储用户认证信息到新Session newSession.setAttribute("user", authenticatedUser); return "redirect:/dashboard"; }
1.2 Cookie属性强化
• Spring Security配置安全Cookie:
@Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED) ) .headers(headers -> headers .httpStrictTransportSecurity(hsts -> hsts.includeSubDomains(true).preload(true) ) ) .csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()); // Cookie安全属性 http.securityContext().securityContextRepository(new CookieSecurityContextRepository()); return http.build(); } public class CookieSecurityContextRepository extends HttpSessionSecurityContextRepository { @Override public void saveContext(SecurityContext context, HttpServletRequest request, HttpServletResponse response) { Cookie cookie = new Cookie("JSESSIONID", request.getSession().getId()); cookie.setSecure(true); // 仅HTTPS传输 cookie.setHttpOnly(true); // 禁止JavaScript访问 cookie.setAttribute("SameSite", "Lax"); response.addCookie(cookie); } }
关键属性说明:
属性 | 作用 |
---|---|
Secure | Cookie仅通过HTTPS传输 |
HttpOnly | 防止XSS攻击窃取Cookie |
SameSite=Lax | 限制第三方网站跨站请求携带Cookie(防御CSRF) |
2. HTTPS配置最佳实践
2.1 Let's Encrypt免费证书申请
• Certbot自动化工具:
# 安装Certbot(Ubuntu示例) sudo apt install certbot python3-certbot-nginx # 申请证书(需提前配置Nginx) sudo certbot --nginx -d yourdomain.com # 自动续期(添加到crontab) 0 3 * * * certbot renew --quiet
2.2 Spring Boot强制HTTPS跳转
• application.yml配置:
server: ssl: enabled: true key-store: classpath:keystore.p12 key-store-password: changeit key-store-type: PKCS12 key-alias: tomcat port: 443
• HTTP自动跳转HTTPS:
@Configuration public class HttpsRedirectConfig { @Bean public ServletWebServerFactory servletContainer() { TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() { @Override protected void postProcessContext(Context context) { SecurityConstraint securityConstraint = new SecurityConstraint(); securityConstraint.setUserConstraint("CONFIDENTIAL"); SecurityCollection collection = new SecurityCollection(); collection.addPattern("/*"); securityConstraint.addCollection(collection); context.addConstraint(securityConstraint); } }; tomcat.addAdditionalTomcatConnectors(httpConnector()); return tomcat; } private Connector httpConnector() { Connector connector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL); connector.setPort(80); connector.setRedirectPort(443); return connector; } }
3. CSRF防御方案
3.1 Spring Security CSRF Token机制
• 默认防御原理: • 服务端生成随机Token(存储在Session或Cookie中)。 • 客户端提交请求时携带Token(表单隐藏字段或请求头)。 • 表单集成示例:
<form th:action="@{/transfer}" method="post"> <input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}"/> <input type="text" name="amount"/> <button type="submit">转账</button> </form>
3.2 前后端分离架构下的CSRF防御
• 双重Cookie验证方案:
-
服务端在登录成功后设置一个随机Token到Cookie:
ResponseCookie cookie = ResponseCookie.from("csrf-token", UUID.randomUUID().toString()) .httpOnly(false) .secure(true) .sameSite("Lax") .build(); response.addHeader(HttpHeaders.SET_COOKIE, cookie.toString());
-
前端在请求头中携带该Token:
fetch('/api/transfer', { method: 'POST', headers: { 'X-CSRF-TOKEN': getCookie('csrf-token') // 从Cookie读取 }, body: JSON.stringify({ amount: 100 }) });
-
服务端验证Cookie和Header中的Token是否一致:
String cookieToken = request.getCookies().stream() .filter(c -> "csrf-token".equals(c.getName())) .findFirst() .map(Cookie::getValue) .orElse(""); String headerToken = request.getHeader("X-CSRF-TOKEN"); if (!cookieToken.equals(headerToken)) { throw new CsrfTokenException("CSRF Token不匹配"); }
总结与实施建议
-
Session管理: • 启用
HttpOnly
和Secure
属性,生产环境强制SameSite=Lax
。 • 集群环境下使用Redis集中存储Session。 -
HTTPS强化: • 启用HSTS头(
Strict-Transport-Security
)并提交预加载列表。 • 定期监控证书有效期(90天续期)。 -
CSRF防御组合拳: • 传统Web应用:优先使用Spring Security原生Token机制。 • 前后端分离:采用双重Cookie验证+SameSite组合。
漏洞自查清单: • 所有Cookie是否设置Secure
和HttpOnly
? • 敏感操作(如支付)是否启用双重认证? • 是否禁用HTTP明文传输?
通过协议加固与会话管理,构建可信的端到端安全通信体系。
五、API安全与微服务防护
1. API接口安全设计
1.1 接口版本控制与限流
• 版本控制: • URL路径版本: ```java @GetMapping("/v1/users/{id}") public UserV1 getUserV1(@PathVariable Long id) { ... }
@GetMapping("/v2/users/{id}") public UserV2 getUserV2(@PathVariable Long id) { ... } ```
• 请求头版本: java @GetMapping("/users/{id}") public ResponseEntity<?> getUser( @PathVariable Long id, @RequestHeader("Api-Version") String version ) { if ("v2".equals(version)) return UserV2.from(userService.findById(id)); return UserV1.from(userService.findById(id)); }
• 限流(Rate Limiting): • Spring Cloud Gateway限流: yaml spring: cloud: gateway: routes: - id: user-service uri: lb://user-service predicates: - Path=/api/users/** filters: - name: RequestRateLimiter args: redis-rate-limiter.replenishRate: 10 # 每秒允许10个请求 redis-rate-limiter.burstCapacity: 20 # 突发容量 key-resolver: "#{@userKeyResolver}" # 按用户限流
• 自定义限流键解析器: java @Bean public KeyResolver userKeyResolver() { return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getHostName()); }
1.2 安全的API文档(Swagger/OAS3)
• 隐藏敏感端点:
@Operation(hidden = true) // 隐藏特定接口 @GetMapping("/internal/users") public List<User> getInternalUsers() { ... }
• 添加认证参数:
@Bean public OpenAPI customOpenAPI() { return new OpenAPI() .components(new Components().addSecuritySchemes("JWT", new SecurityScheme().type(SecurityScheme.Type.HTTP) .scheme("bearer") .bearerFormat("JWT") )) .info(new Info().title("API文档").version("v1")); }
2. 微服务安全架构
2.1 Spring Cloud Gateway鉴权过滤
• JWT解析过滤器:
@Component public class JwtAuthFilter implements GlobalFilter { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { String token = exchange.getRequest().getHeaders().getFirst("Authorization"); if (token == null || !token.startsWith("Bearer ")) { exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED); return exchange.getResponse().setComplete(); } try { Jws<Claims> claims = Jwts.parserBuilder() .setSigningKey(publicKey) .build() .parseClaimsJws(token.replace("Bearer ", "")); exchange.getAttributes().put("user", claims.getBody().getSubject()); return chain.filter(exchange); } catch (JwtException e) { exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED); return exchange.getResponse().setComplete(); } } }
2.2 服务间通信安全(mTLS)
• 生成证书:
# 生成服务端证书 keytool -genkeypair -alias server -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore server.p12 # 生成客户端证书 keytool -genkeypair -alias client -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore client.p12 # 导出客户端公钥并导入服务端信任库 keytool -exportcert -alias client -keystore client.p12 -file client.cer keytool -importcert -alias client -file client.cer -keystore server-truststore.p12
• Spring Boot配置mTLS:
server: ssl: key-store: classpath:server.p12 key-store-password: changeit key-alias: server trust-store: classpath:server-truststore.p12 trust-store-password: changeit client-auth: need # 强制双向认证
3. 第三方API集成风险管控
3.1 密钥动态管理(Vault集成)
• Spring Vault配置:
spring: vault: uri: https://vault.example.com:8200 authentication: TOKEN token: s.xyz123 ssl: trust-store: classpath:vault-truststore.p12 trust-store-password: changeit
• 动态获取API密钥:
@Value("${secrets.api-key}") private String apiKey; public void callThirdPartyAPI() { HttpHeaders headers = new HttpHeaders(); headers.set("X-API-Key", apiKey); // 发起请求 }
3.2 请求签名(HMAC-SHA256)
• 签名生成:
public String signRequest(String secret, String method, String path, String body) { String data = method + path + body; Mac sha256 = Mac.getInstance("HmacSHA256"); sha256.init(new SecretKeySpec(secret.getBytes(), "HmacSHA256")); byte[] hash = sha256.doFinal(data.getBytes(StandardCharsets.UTF_8)); return Base64.getEncoder().encodeToString(hash); }
• 验证签名:
@PostMapping("/api") public ResponseEntity<?> handleRequest( @RequestHeader("X-Signature") String signature, @RequestBody String body ) { String expected = signRequest(apiSecret, "POST", "/api", body); if (!signature.equals(expected)) { throw new InvalidSignatureException("签名验证失败"); } // 处理业务逻辑 }
总结与面试要点
• 高频面试题: • 如何防止API被重放攻击:使用时间戳+随机数+签名,服务端校验时间窗口和随机数唯一性。 • mTLS与单向TLS的区别:mTLS要求客户端和服务器都提供证书,双向验证身份。 • 安全红线: • 禁止在代码或配置中硬编码密钥(如String apiKey = "123456";
)。 • 生产环境禁用Swagger的enable: true
配置。
实施建议: • 分层防御:网关统一鉴权 + 服务间mTLS + 接口级签名。 • 密钥轮换:通过Vault定期自动更新密钥,降低泄露风险。 • 监控告警:对异常签名失败、频繁限流触发进行实时告警。
通过API网关、服务间安全通信和密钥管理,构建端到端的安全防护体系。
六、日志监控与应急响应
1. 安全日志记录
1.1 敏感操作审计追踪
• AOP切面记录关键操作:
@Aspect @Component public class AuditLogAspect { @Autowired private AuditLogService auditLogService; @Around("@annotation(auditLog)") public Object logAudit(ProceedingJoinPoint joinPoint, AuditLog auditLog) throws Throwable { String username = SecurityContextHolder.getContext().getAuthentication().getName(); String method = joinPoint.getSignature().toShortString(); Object result = joinPoint.proceed(); // 记录日志到数据库 auditLogService.log(username, method, "SUCCESS"); return result; } } // 自定义注解标记需要审计的方法 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface AuditLog { String value() default ""; } // 使用示例 @AuditLog("用户登录") @PostMapping("/login") public void login(@RequestBody LoginRequest request) { ... }
• Log4j2高风险事件标记:
<!-- log4j2.xml配置 --> <Filters> <RegexFilter regex=".*(login|payment).*" onMatch="ACCEPT" onMismatch="NEUTRAL"/> </Filters> <Appenders> <Kafka name="SecurityLog" topic="security-log"> <PatternLayout pattern="%d %-5p [%t] %c{1.} - %m%n"/> </Kafka> </Appenders>
2. 异常监控与告警
2.1 Prometheus监控异常请求
• 自定义指标采集:
@Bean public MeterRegistryCustomizer<PrometheusMeterRegistry> configureMetrics() { return registry -> { Counter.builder("http.error.counter") .description("HTTP请求错误计数") .tag("status", "401") .register(registry); }; } @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(AuthenticationException.class) public ResponseEntity<?> handleAuthError(AuthenticationException ex) { Metrics.counter("http.error.counter", "status", "401").increment(); return ResponseEntity.status(401).body("Unauthorized"); } }
• Grafana告警规则配置:
# prometheus-alerts.yml groups: - name: api-alerts rules: - alert: HighUnauthorizedRequests expr: rate(http_error_counter_total{status="401"}[5m]) > 10 for: 5m labels: severity: critical annotations: summary: "高频401错误 (实例 {{ $labels.instance }})" description: "5分钟内401错误率超过10次/秒"
2.2 Spring Boot Actuator告警集成
• 钉钉机器人告警(WebHook):
@Component public class DingTalkNotifier { @Autowired private RestTemplate restTemplate; @EventListener public void handleAlert(AlertEvent event) { String message = String.format("告警: %s\n时间: %s", event.getAlert().getAnnotations().get("summary"), LocalDateTime.now()); restTemplate.postForEntity( "https://oapi.dingtalk.com/robot/send?access_token=xxx", Map.of("msgtype", "text", "text", Map.of("content", message)), String.class ); } }
3. 漏洞应急响应
3.1 Arthas热修复实战
• 动态修改方法逻辑(无需重启):
# 1. 附加到目标Java进程 $ arthas-boot <PID> # 2. 反编译方法查看当前逻辑 arthas> jad com.example.UserService.getUser # 3. 修改方法并编译为字节码 arthas> mc -d /tmp /tmp/UserService.java # 4. 重新加载类 arthas> redefine /tmp/com/example/UserService.class
• 临时禁用危险接口:
# 查找RequestMappingHandlerMapping arthas> sc -d *HandlerMapping # 获取Bean实例ID arthas> get static org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping # 删除指定接口映射 arthas> invoke @12345 unregisterMapping '/vulnerable-api'
3.2 Kubernetes快速回滚
• 版本标签与回滚命令:
# 查看部署历史版本 $ kubectl rollout history deployment/user-service # 回滚到上一版本 $ kubectl rollout undo deployment/user-service # 回滚到指定版本 $ kubectl rollout undo deployment/user-service --to-revision=2
• Docker镜像回退策略:
# 保留旧版本镜像标签(如v1.2.1) FROM openjdk:17-alpine COPY target/user-service-v1.2.1.jar /app.jar CMD ["java", "-jar", "/app.jar"]
# 快速切换镜像版本 $ kubectl set image deployment/user-service *=registry.example.com/user-service:v1.2.1
总结与实施建议
• 日志监控闭环:
-
采集:Log4j2/Kafka收集关键日志。
-
分析:Prometheus监控指标,ELK聚合日志。
-
告警:Grafana阈值告警,钉钉实时通知。 • 应急响应流程:
• **优先级**:热修复 > 版本回滚 > 漏洞修复。 • **演练**:定期模拟攻击场景(如SQL注入),测试响应速度。
• 生产检查清单: • 所有敏感操作是否有审计日志? • 监控面板是否覆盖核心指标(QPS、错误率、响应时间)? • 回滚脚本是否经过验证?
工具链推荐: • 日志分析:ELK Stack(Elasticsearch + Logstash + Kibana) • 热修复:Arthas + JVM-Sandbox • 容器管理:Kubernetes + Helm(版本控制)
通过日志监控与自动化应急响应,最小化漏洞影响时间,保障系统持续安全运行。
七、面试高频安全题解析
1. 经典面试题
1.1 如何防止JWT令牌被盗用?
• 防御措施:
-
HTTPS加密传输:防止中间人窃听令牌。
-
短有效期:设置较短的Access Token有效期(如15分钟)。
-
绑定设备指纹:Token生成时记录设备信息(IP、User-Agent),校验时匹配。
-
Refresh Token轮换:每次刷新Token时作废旧Token并生成新Token。
-
黑名单机制:登出时将未过期的Token加入Redis黑名单。 • 代码示例:
// Token生成时绑定设备指纹 String deviceId = DigestUtils.md5Hex(request.getHeader("User-Agent") + clientIp); claims.put("device", deviceId); // 校验时验证设备信息 if (!tokenDeviceId.equals(currentDeviceId)) { throw new InvalidTokenException("设备不匹配"); }
1.2 解释Spring Security的过滤器链机制
• 核心流程:
-
过滤器链顺序:按注册顺序依次执行过滤器,每个过滤器处理特定安全任务。
-
关键过滤器: ◦
SecurityContextPersistenceFilter
:加载SecurityContext(如从Session)。 ◦UsernamePasswordAuthenticationFilter
:处理表单登录。 ◦BasicAuthenticationFilter
:处理HTTP Basic认证。 ◦FilterSecurityInterceptor
:最终决定是否允许访问。 • 自定义扩展:
@Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.addFilterBefore(new CustomFilter(), UsernamePasswordAuthenticationFilter.class); } }
2. 场景设计题
2.1 设计一个安全的用户注册/登录流程
• 注册流程:
-
密码强度校验:至少8位,包含字母、数字、特殊字符。
-
邮箱/手机验证:发送验证码并校验。
-
密码加密存储:使用BCrypt算法(
BCryptPasswordEncoder
)。 • 登录流程: -
验证码防护:连续失败3次后触发图形验证码。
-
双因素认证(2FA):登录后发送短信/邮箱验证码。
-
Session管理:登录成功后重置Session ID。 • 代码要点:
// 登录失败计数器(Redis实现) String key = "login_fail:" + username; redisTemplate.opsForValue().increment(key); if (redisTemplate.opsForValue().get(key) >= 3) { throw new CaptchaRequiredException("需要验证码"); }
2.2 如何优化存在SQL注入漏洞的老系统?
• 分步方案:
-
代码审查:全局搜索
${}
拼接的SQL语句。 -
紧急修复: ◦ 将
${}
替换为#{}
(MyBatis)。 ◦ 添加输入白名单校验(如字段名、排序方向)。 -
长期优化: ◦ 引入ORM框架(如JPA/Hibernate)。 ◦ 数据库权限最小化(只读账号用于查询)。 • 监控措施:
-- 开启数据库审计日志 SET GLOBAL general_log = 'ON'; -- 分析日志中的可疑SQL(如连续多次SELECT *)
3. 陷阱题
3.1 为什么@PreAuthorize
不能完全替代权限校验?
• 答案本质: • 声明式校验局限性:@PreAuthorize
仅校验接口访问权限,无法覆盖数据级权限。 • 业务逻辑校验缺失:例如用户A只能修改自己的订单,需在Service层二次验证。 • 代码反例:
@PreAuthorize("hasRole('USER')") @PutMapping("/orders/{id}") public void updateOrder(@PathVariable Long id) { // 未校验当前用户是否拥有该订单 orderService.update(id); }
3.2 HTTPS能否防御CSRF攻击?为什么?
• 正确答案: • 不能防御:CSRF攻击利用的是浏览器的Cookie自动携带机制,与通信是否加密无关。 • 防御依赖: 1. CSRF Token:服务端生成随机Token并校验。 2. SameSite Cookie:设置为Lax
或Strict
模式(禁止跨域携带Cookie)。 • 补充场景:
<!-- 恶意网站构造表单 --> <form action="https://bank.com/transfer" method="POST"> <input type="hidden" name="amount" value="1000"> <input type="hidden" name="to" value="attacker"> </form> <!-- 用户已登录bank.com,Cookie自动携带 -->
总结与面试技巧
• 回答结构:
-
直接回答:先给出明确结论(如“不能防御”)。
-
技术解析:结合原理说明原因(如HTTPS加密与CSRF机制无关)。
-
方案补充:给出正确防御措施(如CSRF Token + SameSite)。 • 高频考点:
• **JWT安全**:签名算法选择、Refresh Token设计、黑名单机制。 • **Spring Security**:过滤器链顺序、自定义鉴权逻辑、OAuth2集成。 • **应急响应**:日志分析、热修复与回滚策略。
最终建议:结合具体项目经验,说明实际遇到的挑战与解决方案(如“在XX项目中,我们通过X方法解决了Y安全问题”),展现工程化思维与实战能力。
相关文章:
JAVA:Web安全防御
目录 一、Web安全基础与常见威胁 OWASP Top 10核心漏洞解析 • SQL注入(SQLi)、跨站脚本(XSS)、跨站请求伪造(CSRF) • 不安全的反序列化、敏感数据泄露 Java后端常见攻击场景 • 通过HttpServletRequest…...
Nginx:支持 HTTPS
文章目录 Nginx 开启 ssl 以支持 HTTPS1 生成本地证书2 开启 ssl 以支持 HTTPS3 将 https 的请求转发给 http 最终的 nginx.conf 如下 Nginx 开启 ssl 以支持 HTTPS [!IMPORTANT] 在下文中,将采用如下定义。 HTTP端口: 80 HTTPS端口: 443 服务…...
数据库性能优化(sql优化)_分布式优化思路02_yxy
数据库性能优化_分布式优化思路02 1 核心优化策略(二)_分区智能连接优化2 核心优化策略(三)_数据本地化3 核心优化策略(四)_选择正确的数据分发方式1 核心优化策略(二)_分区智能连接优化 分区智能连接出现在多个表进行连接时的优化策略,优化效率非常明显 分区智能连接是指:…...
【网络】代理服务器收尾及高级IO
全是通俗易懂的讲解,如果你本节之前的知识都掌握清楚,那就速速来看我的笔记吧~ 自己写自己的八股!让未来的自己看懂! (全文手敲,受益良多) 本文主要带你了解什么是高级IO,以及常…...
基于大疆行业无人机的特色解决方案-无线通信篇:基于蜂窝以及自组网MESH的无线通信C2链路
基于大疆行业无人机的特色解决方案-无线通信篇:基于蜂窝以及自组网MESH的无线通信C2链路 大疆无人机目前是业内性价比最有优势的无人机产品,尤其是机场3的推出,持续产品升级迭代,包括司空2、大疆智图以及大疆智运等专业软件、各种…...
js实现2D图片堆叠在一起呈现为3D效果,类似大楼楼层的效果,点击每个楼层不会被其他楼层遮挡
js实现2D图片堆叠在一起呈现为3D效果,类似大楼楼层的效果,点击每个楼层不会被其他楼层遮挡。实现过程使用元素的绝对定位,通过伪元素设置背景图片和文字,效果如下: index.jsx: import React, { useEffect,…...
【安装部署】Linux下最简单的 pytorch3d 安装
最近接触一个项目需要用到 pytorch3d 库,找了好多眼花缭乱的资料,最后发现大道至简~ 1、查看 python,cuda,pytorch 的版本 source activate myMRI # 激活环境 python --version # python 版本查看 nvcc --version # cuda…...
【在阿里云或其他 CentOS/RHEL 系统上安装和配置 Dante SOCKS5 代理服务】
在阿里云或其他 CentOS/RHEL 系统上安装和配置 Dante SOCKS5 代理服务 什么是SOCKS5?前提条件步骤 1:安装 Dante SOCKS5 服务步骤 2:创建专用代理用户(推荐)步骤 3:配置 Dante 服务步骤 4:设置日…...
第十五讲、Isaaclab中在机器人上添加传感器
0 前言 官方教程:https://isaac-sim.github.io/IsaacLab/main/source/tutorials/04_sensors/add_sensors_on_robot.html IsaacsimIsaaclab安装:https://blog.csdn.net/m0_47719040/article/details/146389391?spm1001.2014.3001.5502 传感器有助于智能…...
网络设备智能巡检系统-MCP案例总结
一、案例背景与目标 背景: 企业网络中存在多厂商(华为、H3C、思科等)设备,传统巡检需人工逐台登录,效率低且易出错。 目标: 开发基于自然语言的智能巡检系统,实现: 自然语言指令解析多厂商设备自动化巡检结构化报告生成技术栈: Python + Ollama + Netmiko + FastAPI…...
力扣2685(dfs)
我们对每个连通块进行dfs,在深搜的过程中,定义两个变量v,e.其中v表示该连通图的节点数量,e表示该连通图中边的数量的两倍。为什么是两倍呢?因为我们针对某个节点进行dfs的过程中,我们让e加上这个节点所连边的数量&…...
火山引擎实时语音合成WebSocket V3协议Python实现demo
火山引擎语音整体特点 火山引擎(字节跳动旗下)的语音合成产品确实非常面向多媒体内容创作,特别是短视频、有声书和多人场景。 1. 音色多样性与场景细分 火山引擎提供了极其丰富的音色选择(100音色),并按以下场景精细分类: 多情感音色&…...
Apache SeaTunnel:新一代开源、高性能数据集成工具
Apache SeaTunnel 是一款开源、分布式、高性能的数据集成工具,可以通过配置快速搭建数据管道,支持实时海量数据同步。 Apache SeaTunnel 专注于数据集成和数据同步,主要旨在解决数据集成领域的常见问题: 数据源多样性:…...
【音视频】音频解码实战
音频解码过程 ⾳频解码过程如下图所示: FFmpeg流程 关键函数 关键函数说明: avcodec_find_decoder:根据指定的AVCodecID查找注册的解码器。av_parser_init:初始化AVCodecParserContext。avcodec_alloc_context3:为…...
学习思路分享---从0开始搭建基本web服务器
学习思路分享—从0开始搭建基本web服务器 为什么要搭建yum仓库? 下载系统软件,类似于应用商店,系统软件,podman,镜像,容器,镜像仓库,docker,集装箱, 作用:自动解决依赖关系 为什么要搭建web服务器? 提供网站 , nginx 第一步搭建yum仓库,本地离线仓库 挂载关盘驱动…...
开源模型应用落地-Podcastfy-从文本到声音的智能跃迁-Docker(二)
一、前言 在当今信息呈现方式越来越多样化的背景下,如何将文字、图片甚至视频高效转化为可听的音频体验,已经成为内容创作者、教育者和研究者们共同关注的重要话题。Podcastfy是一款基于Python的开源工具,它专注于将多种形式的内容智能转换成…...
docker 里面没有 wget 也 install 不了
docker 里面没有 wget 也 install 不了 如果你在Docker容器中发现没有安装wget工具,并且无法通过常规方法安装它,这通常是因为容器的基础镜像中缺少包管理工具,或者包源配置不正确。以下是一些可能的解决方案: 使用包管理工具安…...
【无人机】问题分析。查看电机转速时,四个电机转速不一致,QGC中检测到电机转速不均衡
1、问题描述 在组装完成无人机后,对无人机的电机进行测试 在MAVLink Inspector一栏中,点击SERVO_OUTPUT_RAW可以查看飞控输出的PWM信号。 无人机解锁(Armed)后,按照油门大小servo1/2/3/4_raw的值域为1000-2000&…...
Docker Compose常用命令
Docker Compose常用命令 安装docker-comosedocker-compose配置文件及常用指令yaml 文件级docker-compose.yml配置文件示例 docker compose常用命令启动服务停止服务重启服务查看运行容器列表查看服务日志构建镜像docker-compose rm删除 安装docker-comose # 声明版本 VER2.35.…...
生产环境大数据平台权限管理
引言:数据资产保护的生死线 在金融行业某头部企业发生的数据泄露事件中,由于权限管理漏洞导致千万级用户信息外泄,直接经济损失超过2.3亿元。这个案例揭示了生产环境大数据平台权限管理的重要性和复杂性。本文将深入探讨从权限模型设计到实施…...
【连载6】基础智能体的进展与挑战综述-奖励
基础智能体的进展与挑战综述 从类脑智能到具备可进化性、协作性和安全性的系统 【翻译团队】刘军(liujunbupt.edu.cn) 钱雨欣玥 冯梓哲 李正博 李冠谕 朱宇晗 张霄天 孙大壮 黄若溪 5. 奖励 奖励机制帮助智能体区分有益与有害的行为,塑造其学习过程并影响其决策…...
什么是CRM系统,它的作用是什么?CRM全面指南
CRM(Customer Relationship Management,客户关系管理)系统是一种专门用于集中管理客户信息、优化销售流程、提升客户满意度、支持精准营销、驱动数据分析决策、加强跨部门协同、提升客户生命周期价值的业务系统工具。其中,优化销售…...
【AI提示词】投资策略专家
提示说明 投资策略专家致力于帮助用户构建和优化投资组合,实现资产增值。专家通过深入分析市场趋势、经济数据和公司基本面,为用户制定符合其投资目标和风险偏好的策略。 提示词 # 角色 投资策略专家## 注意 1. 投资策略专家需要具备深入分析市场的能…...
川翔云电脑32G大显存集群机器上线!
川翔云电脑今日重磅推出32G 大显存机型,为游戏玩家、设计师、AI 开发者等提供极致云端算力体验! 一、两大核心配置,突破性能天花板 ✅ 32G 超大显存机型 行业领先:搭载 NVIDIA 专业显卡,单卡可分配 32G 独立显存&am…...
最新扣子(Coze)案例教程:飞书多维表格按条件筛选记录 + 读取分页Coze工作流,无限循环使用方法,手把手教学,完全免费教程
大家好,我是斜杠君。 👨💻 星球群里有同学想学习一下飞书多维表格的使用方法,关于如何通过按条件筛选飞书多维表格中的记录,以及如何使用分页解决最多一次只能读取500条的限制问题。 斜杠君今天就带大家一起搭建一…...
ProxySQL 的性能优化需结合实时监控数据与动态配置调整
ProxySQL 的性能优化需结合实时监控数据与动态配置调整,具体操作如下: 一、性能监控实现 内置监控模块配置 启用监控用户:在 global_variables 表中设置监控账号,用于检测节点健康状态: sql UPDATE global_variables SET variable_value=‘monitor’ WHERE va…...
前端框架的“快闪“时代:我们该如何应对技术迭代的洪流?
引言:前端开发者的"框架疲劳" “上周刚学完Vue 3的组合式API,这周SolidJS又火了?”——这恐怕是许多前端开发者2023年的真实心声。前端框架的迭代速度已经达到了令人目眩的程度,GitHub每日都有新框架诞生,n…...
准确--Tomcat更换证书
具体意思是: Starting Coyote HTTP/1.1 on http-8080: HTTP 连接器(端口 8080)启动成功了。严重: Failed to load keystore type PKCS12 with path conf/jlksearch.fzsmk.cn.pfx due to failed to decrypt safe contents entry: javax.crypt…...
数据库对象与权限管理-Oracle数据字典详解
1. 数据字典概念讲解 Oracle数据字典是数据库的核心组件,它存储了关于数据库结构、用户信息、权限设置和系统性能等重要的元数据信息。这些信息对于数据库的日常管理和维护至关重要。数据字典在数据库创建时自动生成,并随着数据库的运行不断更新。 数据…...
黑阈免激活版:智能管理后台,优化手机性能
在使用安卓手机的过程中,许多用户会遇到手机卡顿、电池续航不足等问题。这些问题通常是由于后台运行的应用程序过多,占用大量系统资源导致的。今天,我们要介绍的 黑阈免激活版,就是这样一款由南京简域网络科技工作室开发的手机辅助…...
C# foreach 循环中获取索引的完整方案
一、手动维护索引变量 实现方式: 在循环外部声明索引变量,每次迭代手动递增: int index 0; foreach (var item in collection) { Console.WriteLine($"{index}: {item}"); index; } 特点: 简单直接&#…...
刷题之路:C++ 解题分享与技术总结
目录 引言 ###刷题实战 (一)移除数组中的重复元素 (二)数组中出现次数超过一半的数字 (三)杨辉三角 (四)只出现一次的数字 (五)找出数组中两个只出现一…...
深入探讨:如何完美完成标签分类任务(数据治理中分类分级的分类思考)
文章目录 一、标签分类的核心价值与挑战1.1 标签分类的战略意义1.2 标签分类面临的主要挑战 二、标签分类方法论的系统设计2.1 多层级标签架构设计2.2 精准的标签匹配技术2.3 混合优化策略 三、标签分类的技术实现3.1 高维向量空间中的标签表示3.2 图数据库驱动的标签关系处理3…...
【解决 el-table 树形数据更新后视图不刷新的问题】
内容包含deepseek自动生成内容。第一种亲测可行。 本文章仅用于问题记录 解决 el-table 树形数据更新后视图不刷新的问题 在 Element Plus 的 el-table 中使用树形数据时,当数据更新后视图不自动刷新是一个常见问题。以下是几种解决方案: 问题原因 e…...
MuJoCo中的机器人状态获取
UR5e机器人xml文件模型 <mujoco model"ur5e"><compiler angle"radian" meshdir"assets" autolimits"true"/><option integrator"implicitfast"/><default><default class"ur5e">&…...
第五篇:linux之vim编辑器、用户相关
第五篇:linux之vim编辑器、用户相关 文章目录 第五篇:linux之vim编辑器、用户相关一、vim编辑器1、什么是vim?2、为什么要使用vim?3、vi和vim有什么区别?4、vim编辑器三种模式 二、用户相关1、什么是用户?2…...
taobao.trades.sold.get(淘宝店铺订单接口)
淘宝店铺提供了多种订单接口,可以用来获取订单信息、创建订单、修改订单等操作。 获取订单列表接口:可以使用该接口获取店铺的订单列表,包括订单号、买家信息、订单状态等。 获取单个订单信息接口:可以使用该接口获取指定订单的详…...
媒体发稿攻略,解锁新闻发稿成长新高度
新闻媒体发稿全攻略! 如何快速上稿主流权威央级媒体? 大家好!今天来聊聊媒体发稿的那些事儿,希望能帮到正在发稿或者准备发稿的小伙伴们。 ①明确目标媒体 首先,得搞清楚你要把稿子发给哪些媒体和。这一步非常关键,因为选择适合的媒体是发…...
WebRTC服务器Coturn服务器部署
1、概述 作为WebRTC服务器,只需要部署开源的coturn即可,coturn同时实现了STUN和TURN的协议 2、Coturn具体部署 2.1 Coturn简介 coturn是一个开源的STUN/TURN服务器,把STUN服务器跟TURN服务器都整合为一个服务器,主要提供一下几个功…...
lspci的资料
PCI即Peripheral Component Interconnect。 在 Linux 上使用 lspci 命令查看硬件情况 | Linux 中国 lspci 命令用于显示连接到 PCI 总线的所有设备,从而满足上述需求。该命令由 pciutils 包提供,可用于各种基于 Linux 和 BSD 的操作系统。 使用 lspci 和…...
GitLab 提交权限校验脚本
.git/hooks 目录详解与配置指南 一、什么是 .git/hooks? .git/hooks 是 Git 仓库中一个隐藏目录,用于存放 钩子脚本(Hook Scripts)。这些脚本会在 Git 执行特定操作(如提交、推送、合并)的前/后自动触发&…...
WebRTC服务器Coturn服务器相关测试工具
1、概述 在安装开源的webrtc服务器coturn服务器后,会附带安装coturn的相关工具,主要有以下几种工具 2、turnadmin工具 说明:服务器命令行工具,提供添加用户、添加管理员、生成TURN密钥等功能,turnadmin -h查看详细用…...
基于Python+Pytest实现自动化测试(全栈实战指南)
目录 第一篇:基础篇 第1章 自动化测试概述 1.1 什么是自动化测试 第2章 环境搭建与工具链配置 2.1 Python环境安装(Windows/macOS/Linux) 2.2 虚拟环境管理 2.3 Pytest基础配置(pytest.ini) 第3章 Pytest核心语…...
符号速率估计——小波变换法
[TOC]符号速率估计——小波变换法 一、原理 1.Haar小波变换 小波变换在信号处理领域被成为数学显微镜,不同于傅里叶变换,小波变换可以观测信号随时间变换的频谱特征,因此,常用于时频分析。 当小波变换前后位置处于同一个码元…...
SQLMesh隔离系统深度实践指南:动态模式映射与跨环境计算复用
在数据安全与开发效率的双重压力下,SQLMesh通过动态模式映射、跨环境计算复用和元数据隔离机制三大核心技术,完美解决了生产与非生产环境的数据壁垒问题。本文提供从环境配置到生产部署的完整实施框架,助您构建安全、高效、可扩展的数据工程体…...
调整IntelliJ IDEA中当前文件所在目录的显示位置
文章目录 1. 问题呈现2. 调整方法3. 更改后的界面 更多 IntelliJ IDEA 的使用技巧可查看 IntelliJ IDEA 专栏中的文章: IntelliJ IDEA 1. 问题呈现 在 IntelliJ IDEA 中,我们在浏览某个文件时,文件所在的目录会显示在下方的状态栏中&#x…...
关于ubuntu密码正确但是无法登录的情况
参考这个文章: https://blog.csdn.net/cuichongxin/article/details/117462494 检查一下是不是用户被lock了 输入passwd -s username 如果用户是L状态,那么就是lock了。 使用 passwd -u username 解锁 关于 .bashrc 不生效 有几点: ~/.…...
OpenCV中的透视变换方法详解
文章目录 引言1. 什么是透视变换2. 透视变换的数学原理3. OpenCV中的透视变换代码实现3.1 首先定义四个函数 3.1.1 cv_show() 函数 3.1.2 def resize() 函数 3.1.3 order_points() 函数 3.1.4 four_point_transform() 函数 3.2 读取图片并做预处理3.3 轮廓检测3.4 获取最大…...
基于DeepSeek的网络爬虫技术创新与实践应用
摘要 在人工智能迅猛发展的时代背景下,网络爬虫技术正经历着深刻变革。本文聚焦于融合DeepSeek大模型的开源爬虫框架Crawl4AI,深入探讨其在网络数据抓取与分析领域的技术原理、功能特性、应用实践及未来发展趋势。通过对Crawl4AI的异步操作、动态内容处理…...
Python基于语音识别的智能垃圾分类系统【附源码、文档说明】
博主介绍:✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&…...