@@ -166,6 +166,7 @@ export default (params?: LocalForageDataProviderParams): DataProvider => {
166166 resource : string ,
167167 params : UpdateParams < any >
168168 ) => {
169+ checkResource ( resource ) ;
169170 await initialize ( ) ;
170171 if ( ! data ) {
171172 throw new Error ( 'The dataProvider is not initialized.' ) ;
@@ -185,6 +186,7 @@ export default (params?: LocalForageDataProviderParams): DataProvider => {
185186 return baseDataProvider . update < RecordType > ( resource , params ) ;
186187 } ,
187188 updateMany : async ( resource : string , params : UpdateManyParams < any > ) => {
189+ checkResource ( resource ) ;
188190 await initialize ( ) ;
189191 if ( ! baseDataProvider ) {
190192 throw new Error ( 'The dataProvider is not initialized.' ) ;
@@ -209,6 +211,7 @@ export default (params?: LocalForageDataProviderParams): DataProvider => {
209211 resource : string ,
210212 params : CreateParams < any >
211213 ) => {
214+ checkResource ( resource ) ;
212215 await initialize ( ) ;
213216 if ( ! baseDataProvider ) {
214217 throw new Error ( 'The dataProvider is not initialized.' ) ;
@@ -232,6 +235,7 @@ export default (params?: LocalForageDataProviderParams): DataProvider => {
232235 resource : string ,
233236 params : DeleteParams < RecordType >
234237 ) => {
238+ checkResource ( resource ) ;
235239 await initialize ( ) ;
236240 if ( ! baseDataProvider ) {
237241 throw new Error ( 'The dataProvider is not initialized.' ) ;
@@ -247,6 +251,7 @@ export default (params?: LocalForageDataProviderParams): DataProvider => {
247251 return baseDataProvider . delete < RecordType > ( resource , params ) ;
248252 } ,
249253 deleteMany : async ( resource : string , params : DeleteManyParams < any > ) => {
254+ checkResource ( resource ) ;
250255 await initialize ( ) ;
251256 if ( ! baseDataProvider ) {
252257 throw new Error ( 'The dataProvider is not initialized.' ) ;
@@ -269,6 +274,13 @@ export default (params?: LocalForageDataProviderParams): DataProvider => {
269274 } ;
270275} ;
271276
277+ const checkResource = resource => {
278+ if ( [ '__proto__' , 'constructor' , 'prototype' ] . includes ( resource ) ) {
279+ // protection against prototype pollution
280+ throw new Error ( `Invalid resource key: ${ resource } ` ) ;
281+ }
282+ } ;
283+
272284export interface LocalForageDataProviderParams {
273285 defaultData ?: any ;
274286 prefixLocalForageKey ?: string ;
0 commit comments