软件开发进阶技能之性能与安全调优(四)

在线体验各类最新模型,更有模型 免费Token 额度领取!
立即体验
简介: 本节聚焦安全调优:严守最小权限原则,缩减攻击面。涵盖SQL注入(禁用拼接,用PreparedStatement/MyBatis #{})、XSS(输出编码+框架自动转义)、命令注入(白名单校验);JWT安全(强密钥、合理过期、防算法混淆);会话固定防护与bcrypt加盐哈希密码存储。

第二部分:安全调优
安全调优的目标是减少系统的攻击面,遵循最小权限原则,并对常见漏洞进行防御。

一. 输入验证与输出编码

1.1 防止 SQL 注入
绝对不要使用字符串拼接 SQL!

// 高危:拼接输入
String name = request.getParameter("name");
String sql = "SELECT * FROM users WHERE name = '" + name + "'";
// 输入:' OR '1'='1  --> 全表查询

// 正确:使用预编译语句(PreparedStatement)或 ORM 框架
String safeSql = "SELECT * FROM users WHERE name = ?";
PreparedStatement ps = connection.prepareStatement(safeSql);
ps.setString(1, name);
ResultSet rs = ps.executeQuery();

// 使用 MyBatis 时注意 #{} 和 ${} 的区别
// 正确:#{name}  错误:${name} (仍可能注入,仅用于动态表名/列名)

1.2 防止 XSS (跨站脚本攻击)
输出编码(Output Encoding)

// 使用 OWASP Java Encoder 对 HTML 上下文编码
import org.owasp.encoder.Encode;

String userInput = request.getParameter("comment");
// 输出到 HTML 中
response.getWriter().write(Encode.forHtml(userInput));

// 输出到 JavaScript 字符串中
response.getWriter().write(Encode.forJavaScript(userInput));

// 输出到 URL 参数中
String url = "/search?q=" + Encode.forUriComponent(userInput);

使用 Spring 的 HtmlUtils 或 Thymeleaf 默认自动转义,但要避免使用 th:utext(未转义文本)。

1.3 防止命令注入
避免 Runtime.exec() 或 ProcessBuilder 直接拼接用户输入。如果必须调用外部命令,使用白名单校验。

// 危险:用户输入 "127.0.0.1; rm -rf /"
String ip = request.getParameter("ip");
Runtime.getRuntime().exec("ping " + ip);

// 安全:使用正则校验 IP 格式
Pattern ipPattern = Pattern.compile("^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.");
if (ipPattern.matcher(ip).matches()) {
    // 校验通过后再执行
}

二. 身份认证与会话管理

2.1 JWT 安全使用
使用强密钥(HS256 密钥长度 ≥ 256 bits,RS256 密钥长度 ≥ 2048 bits)

设置合理的 wap588.net 过期时间(exp)

禁止将敏感信息如密码存入 JWT

防止算法混淆攻击(如果服务端接受 none 算法或允许修改 alg)

// JWT 生成(使用 Nimbus JOSE + JWT 库)
JWSSigner signer = new MACSigner(secretKeyBytes);
JWTClaimsSet claims = new JWTClaimsSet.Builder()
    .subject(userId)
    .issueTime(new Date())
    .expirationTime(new Date(System.currentTimeMillis() + 3600000)) // 1 小时
    .claim("role", "USER")
    .build();
SignedJWT signedJWT = new SignedJWT(new JWSHeader(JWSAlgorithm.HS256), claims);
signedJWT.sign(signer);
String token = signedJWT.serialize();

2.2 会话固定攻击防护
登录成功后必须生成新的会话 ID。

// Servlet 中
HttpSession oldSession = request.getSession(false);
if (oldSession != null) {
    oldSession.invalidate();  // 销毁原会话
}
HttpSession newSession = request.getSession(true); // 创建新会话

Spring Security 默认已防护(sessionManagement().sessionFixation().migrateSession())。

2.3 密码存储
使用 bcrypt、scrypt 或 PBKDF2 加盐哈希,禁止 MD5/SHA1。

bcrypt 内置盐且计算慢,可防御彩虹表和暴力破解。

// Spring Security BCryptPasswordEncoder
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(10); // strength=10 迭代次数 2^10
String encodedPassword = encoder.encode("userPassword");
boolean matches = encoder.matches("rawPassword", encodedPassword);
相关文章
|
28天前
|
运维 Java 测试技术
程序员必备的十大技能(进阶版)之性能调优与故障排查(四)
教程来源 https://aescc.cn/ 本节系统介绍Java应用性能分析与稳定性保障核心实践:涵盖Arthas诊断、火焰图性能剖析、全链路压测方法论及JMeter实战、混沌工程故障注入(ChaosBlade),并复盘Full GC与数据库死锁两大典型故障案例,助力高效定位与解决线上性能问题。
|
26天前
|
SQL 人工智能 自然语言处理
Vibe Coding 是什么?当“感觉编程”遇上数据库
Vibe Coding是2026年编程圈最火的概念之一,指开发者通过自然语言描述“感觉”或“意图”,由AI自动生成代码、调试、优化。本文从Vibe Coding的起源讲起,分析它如何改变数据库开发方式:从手写SQL到自然语言查询、从人工调索引到AI推荐、从经验运维到智能诊断。探讨这项趋势对DBA职业的影响,并给出拥抱变化的实用建议。技术会变,但人的判断力、审美和业务理解才是长期竞争力。
|
NoSQL Java 关系型数据库
【AgentScope Java新手村系列】(5)记忆与会话管理
记忆与会话管理 — AgentState 管理上下文窗口,AgentStateStore 持久化,RuntimeContext.sessionId 隔离多用户会话。
273 0
|
26天前
|
缓存 前端开发 JavaScript
阿里云 OSS 实战:从零搭建静态网站托管 + CDN 加速完整指南
本文分享阿里云OSS+CDN托管静态站点的实战方案:省去服务器运维,提升国内访问速度至50ms内;涵盖Bucket配置、SPA路由适配、自动化部署(CLI/GitHub Actions)、HTTPS与CDN缓存策略,并附成本估算(约¥18/月)和常见坑点解析,适合前端开发者快速落地。
|
26天前
|
弹性计算 负载均衡 安全
阿里云负载均衡(SLB)从入门到精通:完整配置流程与最佳实践
本文详细讲解阿里云负载均衡(SLB)的完整配置流程,涵盖实例创建、服务器组配置、监听设置、健康检查、安全策略及优化实践,同时包含常见问题解答,帮助用户快速掌握SLB部署与运维核心技能。
|
26天前
|
缓存 人工智能 API
阿里云百炼Token Plan团队版与Coding Plan核心差异全解析 附团队版全场景常见问题完整答疑
随着大模型在研发、办公、企业自动化场景常态化落地,不同使用者群体的算力消耗特征出现明显分化:数十人多岗位协同的企业团队,存在多角色额度分配、跨业务线统一计费、月度预算锁定、高峰算力保障等综合管理需求;而独立程序员、外包开发小组、学生研发爱好者,绝大多数算力消耗集中在代码生成、调试、项目重构、脚本编写等开发场景,对文档分析、多模态图文处理需求极低,更看重轻量化低价订阅、代码专属折扣、编程工具配套权益。
247 0
|
26天前
|
开发框架 测试技术 定位技术
Codex 实践系列 Vol.02:让 Codex 读懂开源项目 Typer
这次用 Codex 读 Typer,最重要的一点是:面对一个新项目,第一步先别急着让它写代码。比较稳妥的做法,是先让 Codex 读目录、找入口、解释核心文件,再沿着一个具体功能追下去,最后通过测试理解项目如何验证行为。
199 3
Codex 实践系列 Vol.02:让 Codex 读懂开源项目 Typer
|
26天前
|
存储 人工智能 算法
Claude Code自我进化系统解析:AI编程助手持久化记忆与行为学习实现方案
在日常使用Claude Code开展编程工作时,多数用户都会遇到一个普遍痛点:每开启一次全新会话,AI都会清空此前的对话内容、项目认知与个人编码习惯。此前沟通的项目架构、反复确认的代码规范、调试总结的经验教训都需要重新讲解,不仅耗费大量时间,还会降低整体开发效率。针对这一问题,业内技术团队基于Claude Code原生能力,搭建了一套完整的持久化记忆与自我进化系统,让这款AI编程助手能够跨会话留存信息、自主学习用户行为规律,逐步适配个人与团队的开发模式。本文将完整拆解这套系统的整体架构、核心模块、技术实现、运行流程以及落地效果,同时讲解设计思路与优化细节,为AI编程工具的深度定制提供参考。
223 4
|
26天前
|
缓存 人工智能 自然语言处理
阿里云百炼通义千问Qwen3.6-Flash完整实操指南:轻量化旗舰功能特性、落地优势与分层优惠订阅方案详解
当前AI应用落地场景分化愈发明显,除复杂智能体、百万字长文档、全栈大型工程开发等高门槛业务外,大量企业存在高频轻量问答、实时客服对话、短文本批量生成、简单数据提取、前端实时交互等标准化轻量化需求。这类场景单日调用频次可达数万乃至数十万次,对接口响应延迟、单轮调用成本、并发承载能力有极高要求,若选用高规格旗舰模型会造成算力预算严重浪费,而普通基础轻量化模型又存在逻辑推理弱、工具调用不稳定、短文本输出质量差等短板。
370 4
|
26天前
|
人工智能 缓存 监控
阿里云百炼Token Plan全维度详解:核心功能、团队使用优势与AI生产力模型订阅实操指南
随着AI智能体、长文档解析、全栈代码开发、多模态图文分析等业务在企业内部常态化落地,绝大多数团队在大模型调用过程中暴露出一系列成本与管理痛点:按量付费模式账单波动剧烈,业务高峰期调用量激增导致月度预算严重超支;多员工共用模型资源时无法实现额度隔离,单人超额消耗会挤占整个团队算力;不同型号大模型单价差异大,切换模型后计费规则不统一,财务核算流程繁琐;算力高峰时段按量调用容易出现排队延迟、接口限流,影响业务系统稳定运行;团队缺乏统一的用量监控、权限分级、预算预警能力,AI资源使用处于无管控状态。
221 1