shiro的rememberMe各种漏洞一刀切解决

rememberMe的低版本AES固定密码导致的漏洞,高版本仍然有被爆破,穷举的风险等。这种东西总是在安全检测的时候被拿出来说事儿,然而项目中并未开启rememberMe,也就是说压根不需要这个功能。那此时采用重写代码来直接杜绝这东西即可,任凭它怎么检测,已经没有这个口子了。

跟踪源码会发现,在创建DefaultWebSecurityManager的时候,默认会注入一个CookieRememberMeManager,它里面就是主要实现这个rememberMe的功能。image

而且没有提供注入CookieRememberMeManager的构造类,但是父类中提供了set方法
image

处理办法

  1. 自己实现一个RememberMeManager继承AbstractRememberMeManager。空的实现即可,不提供任何相关逻辑,因为压根用不到。比如如下:
    public class IgnoreRememberManager extends AbstractRememberMeManager {

    @Override
    protected void forgetIdentity(Subject subject) {}

    @Override
    protected void rememberSerializedIdentity(Subject subject, byte[] serialized) {
    }

    @Override
    protected byte[] getRememberedSerializedIdentity(SubjectContext subjectContext) {
    return null;
    }
    @Override
    public void forgetIdentity(SubjectContext subjectContext) {}
    }

  2. 创建DefaultWebSecurityManager时设置它即可,比如Spring配置文件:
    <bean id="rememberMeManager" class="com.lw.security.shiro.IgnoreRememberManager"/> <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <property name="realm" ref="shiroDbRealm" /> <property name="cacheManager" ref="shiroEhcacheManager" /> <property name="rememberMeManager" ref="rememberMeManager" /> <property name="subjectFactory" ref="casSubjectFactory"></property> </bean>

如此一来,等于完全剔除了这个功能,没有相关逻辑了。后续需要实现的时候,自行再填充自定义逻辑即可。

posted @ 2024-04-01 17:49  冰雪女娲  阅读(215)  评论(0编辑  收藏  举报