React Redux新手求助:如何手动编写Redux Persist的saveUserFilter函数?
手动实现redux-persist过滤Transform替代createFilter
你可以自己写一个符合redux-persist规范的transform对象,替代redux-persist-transform-filter的createFilter功能,彻底避开lodash.set的原型污染漏洞。具体实现如下:
// 定义需要保留的user字段 const allowedUserFields = ['username', 'displayName', 'timeZone']; const saveUserFilter = { // 持久化到存储前的处理:只保留user下指定字段 out: (state, key) => { if (key !== 'user') return state; if (!state) return state; const filteredState = {}; allowedUserFields.forEach(field => { // 仅复制state自身存在的字段,避免原型链属性污染 if (Object.prototype.hasOwnProperty.call(state, field)) { filteredState[field] = state[field]; } }); return filteredState; }, // 从存储读取后的处理:直接返回过滤后的存储数据 in: (state, key) => { if (key !== 'user') return state; return state; } }; // 原persistConfig保持不变,替换transforms里的saveUserFilter即可 const persistConfig = { key: KEY, storage, whitelist: [ 'user', 'timeZones', ], transforms: [ saveUserFilter ], };
核心逻辑说明:
out方法:仅对user这个reducer的状态做处理,遍历允许的字段列表,只复制状态自身存在的字段到新对象,过滤掉不需要持久化的内容。用Object.prototype.hasOwnProperty.call是为了规避原型链属性的意外读取,提升安全性。in方法:存储的数据已经是过滤后的安全内容,直接返回即可;如果需要在读取时合并现有状态的其他字段,可以在这里自定义合并逻辑(比如return {...currentState, ...state},不过redux-persist默认会自动合并状态,通常不需要额外操作)。
这个实现完全不依赖第三方库,既避免了漏洞风险,又完美复刻了你之前用createFilter实现的功能。
内容的提问来源于stack exchange,提问作者scrscr87
相关产品推荐
相关产品推荐

