Shiro安全防护机制实战指南

1. CSRF防御:Token校验与表单防护

CSRF(跨站请求伪造)是一种常见攻击方式,Shiro通过内置的CsrfFilter提供防护。

实现原理

  • 服务端生成随机Token(存储在Session中)
  • 表单提交/API请求必须携带该Token
  • 服务端校验Token有效性
// 启用CSRF防护(shiro.ini配置)
[main]
csrfFilter = org.apache.shiro.web.filter.authc.CsrfFilter
filterChainDefinitionMap.put("/**", csrfFilter)

// 表单中需添加Token
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>

实践建议

  1. 对敏感操作(如转账、改密)必须启用CSRF防护
  2. Token应设置合理有效期(默认与Session一致)
  3. 配合Referer头校验增强安全性

2. 会话固定攻击防护:Session ID迁移策略

会话固定攻击指攻击者诱骗用户使用已知的Session ID登录。

Shiro防护方案

图1

配置方式

DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
// 启用会话固定防护
sessionManager.setSessionIdUrlRewritingEnabled(false); 
sessionManager.setSessionValidationSchedulerEnabled(true);

3. 暴力破解防护:登录尝试限制与锁定

实现方案

public class RetryLimitRealm extends AuthorizingRealm {
    private Cache<String, AtomicInteger> passwordRetryCache;

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(...) {
        AtomicInteger retryCount = passwordRetryCache.get(username);
        if (retryCount != null && retryCount.get() > 5) {
            throw new ExcessiveAttemptsException();
        }
        // ...正常认证逻辑
    }
}

最佳实践

  • 失败次数阈值建议3-5次
  • 锁定时间逐渐递增(如5分钟→30分钟→24小时)
  • 记录审计日志用于分析攻击行为

4. HTTPS强制:安全传输层配置

配置示例

[main]
sslFilter = org.apache.shiro.web.filter.authz.SslFilter
sslFilter.port = 443

[urls]
/** = sslFilter

部署建议

  1. 使用Let's Encrypt获取免费证书
  2. 启用HSTS头(Strict-Transport-Security)
  3. 定期更新SSL/TLS协议版本

5. CORS支持:跨域资源访问控制

Shiro集成方案

CorsConfiguration config = new CorsConfiguration();
config.addAllowedOrigin("https://trusted.com");
config.setAllowCredentials(true);

DefaultFilterChainManager manager = new DefaultFilterChainManager();
manager.addFilter("cors", new CorsFilter(config));

安全策略

  1. 严格限制Access-Control-Allow-Origin
  2. 敏感接口禁用CORS
  3. 预检请求(OPTIONS)应快速响应

综合防护建议

  1. 生产环境应组合使用多种防护机制
  2. 定期进行安全扫描和渗透测试
  3. 保持Shiro版本更新(修复已知漏洞)
  4. 敏感操作应增加二次验证(如短信验证码)

通过合理配置这些安全机制,可以显著提升基于Shiro的应用系统安全性。实际部署时应根据业务特点调整防护策略的严格程度。

评论已关闭