Параметр приемника не работает в прокси 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)`