Параметр приемника не работает в прокси javascript

Я использую прокси javascript для защиты объекта, я проверяю, есть ли у получателя свойство пароля, соответствующее строке. Однако, когда я запускаю этот код, я получаю сообщение об ошибке "Превышен максимальный размер стека вызовов". Он прекрасно работает без параметра приемника.

Я использую узел JS.

Вот мой код:

function secureObj(obj,password,logMessage = `attempted manipulation of 
data`,deleteData = false,evalCode = '',evalCodeSuccess = '') {
  let symbol = Symbol() 
  let symbol2 = Symbol()


  let secure = {
    [symbol]: {
      [symbol2]: obj
    }
  }

    let ProxyObj = new Proxy(secure[symbol], {
    get: function trapGet(target,property,receiver) {
      if(receiver.password === password) {
        eval(evalCodeSuccess)
        Reflect.get(target[symbol2],property,receiver)
      } else {
        console.log(logMessage)
        eval(evalCode)
        if(deleteData === true) {
          delete secure[symbol]
        }
      }
    },

    set: function trapSet(target,property,value,receiver) {
      if(receiver.password === password) {
        eval(evalCodeSuccess)
        Reflect.set(target[symbol2],property,value,receiver)
      } else {
        console.log(logMessage, `was setting data to: ${value}`)
        eval(evalCode)
       if(deleteData === true) {
          delete secure[symbol]
        }
      }
    }
  })

  symbol = Error('Access denied')
  return ProxyObj
} 


let key = {
  password: '1234'
}

let attacker = {}

let obj = secureObj({address:'Place'},'1234')

key.newData = obj.address
attacker.newData = obj.address

console.log(key)
console.log(attacker)

Я понимаю, что eval - это плохо, это только для целей тестирования.

Ожидаемые результаты:

attempted manipulation of data

{password:'1234', newData:'Place'}{password:'1234', newData:undefined}

фактические результаты:

`RangeError: Maximum call stack size exceeded`
`at Object.trapGet [as get] (C:\Users\Miles\Desktop\test.js:14:26)`
`at Object.trapGet [as get] (C:\Users\Miles\Desktop\test.js:15:19)`

0 ответов

Другие вопросы по тегам