ruoyi-vue-pro安全测试:渗透测试与问题修复
概述
RuoYi-Vue-Pro作为一款企业级后台管理系统,承载着大量重要业务数据,其安全性至关重要。本文将深入分析该项目的安全架构,提供完整的渗透测试方案,并详细讲解常见问题的修复方法。
安全架构深度解析
1. 认证与授权机制
项目采用Spring Security + JWT Token的认证方案,核心组件包括:
- TokenAuthenticationFilter: 负责Token的验证和解析
- SecurityFrameworkUtils: 安全工具类,提供用户信息获取
- AuthenticationEntryPointImpl: 认证失败处理
- AccessDeniedHandlerImpl: 权限不足处理
2. XSS防护体系
// XSS过滤器配置
@Bean
public FilterRegistrationBean<XssFilter> xssFilter(XssProperties properties,
PathMatcher pathMatcher,
XssCleaner xssCleaner) {
return createFilterBean(new XssFilter(properties, pathMatcher, xssCleaner),
WebFilterOrderEnum.XSS_FILTER);
}
// JSON反序列化时的XSS过滤
@Bean
public Jackson2ObjectMapperBuilderCustomizer xssJacksonCustomizer() {
return builder -> builder.deserializerByType(String.class,
new XssStringJsonDeserializer(properties, pathMatcher, xssCleaner));
}
3. 接口保护机制
项目提供了多重接口保护:
| 保护类型 | 实现类 | 功能描述 |
|---|---|---|
| 限流保护 | RateLimiterAspect | 防止接口被频繁调用 |
| 幂等保护 | IdempotentAspect | 防止重复提交 |
| API签名 | ApiSignatureAspect | 验证请求合法性 |
| 分布式锁 | Lock4j相关组件 | 防止并发问题 |
渗透测试实战指南
1. 认证绕过测试
测试用例:Token伪造攻击
# 尝试使用无效Token访问敏感接口
curl -H "Authorization: Bearer invalid_token" \
http://localhost:48080/admin-api/system/user/page
# 测试Token过期处理
curl -H "Authorization: Bearer expired_token" \
http://localhost:48080/admin-api/system/user/page
预期结果: 应返回401状态码和明确的错误信息
2. SQL注入测试
测试用例:用户查询接口
# 正常请求
curl "http://localhost:48080/admin-api/system/user/page?pageNo=1&pageSize=10"
# SQL注入尝试
curl "http://localhost:48080/admin-api/system/user/page?username=admin' OR '1'='1"
防护验证: MyBatis Plus已内置SQL注入防护,应返回空结果而非报错信息
3. XSS攻击测试
测试用例:用户昵称注入
# 尝试存储型XSS
curl -X POST "http://localhost:48080/admin-api/system/user/update" \
-H "Content-Type: application/json" \
-d '{
"id": 1,
"nickname": "<script>alert(\"XSS\")</script>"
}'
防护验证: XSS过滤器应自动清理恶意脚本
4. CSRF攻击测试
测试用例:跨站请求伪造
<!-- 恶意网站中的表单 -->
<form action="http://localhost:48080/admin-api/system/user/delete" method="POST">
<input type="hidden" name="id" value="1">
<input type="submit" value="点击有奖">
</form>
防护验证: 项目已禁用CSRF保护(因使用Token认证),但需确保Token不会通过URL传递
5. 越权访问测试
测试用例:水平越权
# 用户A尝试访问用户B的数据
curl -H "Authorization: Bearer userA_token" \
"http://localhost:48080/admin-api/system/user/get?id=2"
防护验证: 应实现数据权限控制,返回403状态码
常见问题修复方案
1. SQL注入问题修复
问题代码:
@Select("SELECT * FROM system_user WHERE username = '${username}'")
List<UserDO> selectByUsername(@Param("username") String username);
修复方案:
// 使用#{}预编译方式
@Select("SELECT * FROM system_user WHERE username = #{username}")
List<UserDO> selectByUsername(@Param("username") String username);
// 使用MyBatis Plus的Wrapper
LambdaQueryWrapper<UserDO> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(UserDO::getUsername, username);
userMapper.selectList(wrapper);
2. XSS问题修复
问题场景: 富文本编辑器内容输出未过滤
修复方案:
// 启用XSS过滤配置
yudao:
xss:
enable: true
exclude-urls: /admin-api/system/richtext/**
// 手动过滤特定字段
public String safeOutput(String content) {
if (StringUtils.isNotEmpty(content)) {
return Jsoup.clean(content, Safelist.relaxed());
}
return content;
}
3. 越权访问修复
问题场景: 缺少数据权限校验
修复方案:
@Service
public class UserServiceImpl implements UserService {
@DataPermission(deptAlias = "u", userAlias = "u")
public UserDO getUser(Long id) {
// 自动添加数据权限条件
return userMapper.selectById(id);
}
// 手动权限校验
public UserDO getUserWithCheck(Long id) {
UserDO user = userMapper.selectById(id);
if (user != null && !securityFrameworkService.hasPermission(user.getDeptId())) {
throw new AccessDeniedException("无权限访问该用户数据");
}
return user;
}
}
4. 敏感信息泄露修复
问题场景: 错误信息过于详细
修复方案:
# 配置详细的错误信息仅开发环境显示
spring:
profiles:
active: dev
mvc:
throw-exception-if-no-handler-found: true
web:
resources:
add-mappings: false
# 生产环境配置
spring:
profiles:
active: prod
mvc:
throw-exception-if-no-handler-found: false
安全配置最佳实践
1. 密码安全策略
# 密码加密配置
yudao:
security:
token-secret: your-256-bit-secret # 必须修改为随机字符串
token-expire-time: 7200
password-encoder: bcrypt
# BCrypt强度配置
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder(12); // 强度为12
}
2. API安全加固
// 接口限流配置
@RateLimiter(count = 10, time = 1, timeUnit = TimeUnit.SECONDS,
keyResolver = ClientIpRateLimiterKeyResolver.class)
@PostMapping("/login")
public CommonResult<AuthLoginRespVO> login(@RequestBody AuthLoginReqVO reqVO) {
// 登录逻辑
}
// 幂等性保护
@Idempotent(timeout = 10, timeUnit = TimeUnit.SECONDS)
@PostMapping("/create")
public CommonResult<Long> create(@RequestBody UserCreateReqVO reqVO) {
// 创建用户逻辑
}
3. 日志与监控
# 安全日志配置
logging:
level:
cn.iocoder.yudao.framework.security: DEBUG
cn.iocoder.yudao.framework.web: DEBUG
file:
path: logs/
name: security.log
# 异常监控
management:
endpoints:
web:
exposure:
include: health,info,metrics
endpoint:
health:
show-details: when_authorized
自动化安全测试方案
1. OWASP ZAP集成测试
# 使用Docker运行ZAP扫描
docker run -t owasp/zap2docker-stable zap-baseline.py \
-t http://localhost:48080 \
-r scan-report.html
# 生成详细报告
docker run -t owasp/zap2docker-stable zap-full-scan.py \
-t http://localhost:48080 \
-r full-scan-report.html
2. SonarQube代码质量检测
# sonar-project.properties配置
sonar.projectKey=ruoyi-vue-pro
sonar.projectName=RuoYi-Vue-Pro
sonar.projectVersion=1.0.0
sonar.sources=src/main/java
sonar.tests=src/test/java
sonar.java.binaries=target/classes
sonar.exclusions=**/generated/**,**/test/**
sonar.coverage.exclusions=**/config/**,**/entity/**
# 安全相关规则
sonar.security.relevancy=HIGH
3. 自定义安全测试用例
@SpringBootTest
public class SecurityTest {
@Test
public void testSqlInjectionProtection() {
// 测试SQL注入防护
String maliciousInput = "admin' OR '1'='1";
LambdaQueryWrapper<UserDO> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(UserDO::getUsername, maliciousInput);
List<UserDO> users = userMapper.selectList(wrapper);
Assert.assertTrue(users.isEmpty(), "SQL注入防护失效");
}
@Test
public void testXssFilter() {
// 测试XSS过滤
String xssPayload = "<script>alert('XSS')</script>";
String filtered = xssCleaner.clean(xssPayload);
Assert.assertFalse(filtered.contains("<script>"), "XSS过滤失效");
}
}
应急响应与问题管理
1. 安全事件响应流程
2. 问题管理策略
| 问题等级 | 响应时限 | 处理流程 |
|---|---|---|
| 严重(Critical) | 2小时内 | 立即下线,紧急修复 |
| 高(High) | 24小时内 | 优先修复,监控异常 |
| 中(Medium) | 72小时内 | 计划内修复 |
| 低(Low) | 下次版本更新 | 常规修复 |
总结
RuoYi-Vue-Pro项目在安全方面提供了较为完善的防护机制,但在实际部署时仍需注意:
- 修改默认配置:Token密钥、数据库密码等必须修改
- 定期安全扫描:使用自动化工具进行持续安全检测
- 权限最小化:遵循最小权限原则配置系统权限
- 日志监控:建立完善的安全日志监控体系
- 应急响应:制定详细的安全事件响应流程
通过本文提供的渗透测试方案和问题修复指南,可以显著提升RuoYi-Vue-Pro项目的安全性,为企业级应用提供可靠的安全保障。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



