Проблема безопасности JavaScript

1

Я хочу знать, как следующая функция устанавливает этот элемент и извлекает ячейку массива? Пожалуйста.

//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)
  • 0
    this ключевое слово может иметь разные значения в зависимости от контекста. Вы нигде не объявили переменную result , поэтому по умолчанию она имеет глобальную область видимости, поэтому она становится доступной вне функции. Не могли бы вы предоставить более подробную информацию о вашей проблеме
  • 0
    @CROSP У меня есть некоторые критические материалы, и я хочу, чтобы они были в безопасности. один из моих друзей прислал мне этот код, и я понял, что он может получить доступ к приватным переменным, используя мои объекты API.
Показать ещё 2 комментария
Теги:
security
this

1 ответ

5
Лучший ответ

Случается, что 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] и результат будет содержать первую запись массива.

  • 0
    Я не могу понять, как это было переопределено? В какой строке? как?
  • 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 ).
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню