Параметр Receiver не работает в прокси JavaScript - PullRequest
0 голосов
/ 20 января 2019

Я использую прокси 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)`
...