Я хочу знать, как следующая функция устанавливает этот элемент и извлекает ячейку массива? Пожалуйста.
//my secure code
var priv = ['item-0','item-1'];
var api = {push: function(x){priv.push(x)}}
api.store = function(i,x){priv[i] = x}
//the attaker script
var result;
api.store('push',function(){result = this[0]});
api.push();
//the result is cell 0 of private array
//how?
//if i change the 'push' parameter then the result is empty!
document.write(result)
Случается, что api.store('push',function(){result = this[0]});
переопределяет метод push
priv
массива. Это означает, что после этой строки push
больше не является методом push, который изначально предоставляет javascript, но пользовательская функция злоумышленников, которая является function(){result = this[0]}
. Теперь, когда вы вызываете api.push()
он вызывает priv.push(x)
который был переопределен. Поскольку push
вызывается на объект, this
привязывается к объекту, который является priv
(более подробно об этом в статье MDN об этом). Следовательно, result = this[0]
равен result = priv[0]
и результат будет содержать первую запись массива.
api.store('push',function(){result = this[0]});
вызывает api.store = function(i,x){priv[i] = x}
. Здесь i
- push, а x - функция, которую передал ваш злоумышленник. Это означает, что вы эффективно выполняете priv["push"] = function(){result = this[0]}
что равно priv.push = function(){result = this[0]}
(следовательно, переопределяете метод push
).
this
ключевое слово может иметь разные значения в зависимости от контекста. Вы нигде не объявили переменнуюresult
, поэтому по умолчанию она имеет глобальную область видимости, поэтому она становится доступной вне функции. Не могли бы вы предоставить более подробную информацию о вашей проблеме