Я использую прокси JavaScript для защиты объекта, и я проверяю, есть ли у получателя свойство пароля, соответствующее строке. Однако, когда я запускаю этот код, я получаю сообщение об ошибке «Превышен максимальный размер стека вызовов», и он прекрасно работает без параметра получателя.
Я использую Node.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)`