2010-11-03 4 views
1

У меня есть вопрос о защищенной памяти javascript. Если у меня есть функция:Отображение частных переменных в Javascript

var obj = function(){ 
    var secret = "secret", 
     super_secret = "my super secret string"; 
    return { 
     get_secret: function() { 
      return secret; 
     }() 
    } 
}(); 

Можно ли получить строку из super_secret любыми способами?

Я видел некоторый эксплойт, который использовал throw() и Error(), чтобы получить переменную из функции. Однако это не было сделано с закрытием. Все входные данные и «hunches» приветствуются. Я планирую проект, где мне нужно быть уверенным, что нет никакого известного способа извлечь или изменить переменную super_secret.

ответ

1

Существует почти нет способа сделать это. Даже если вы загружаете данные с какого-либо сервера, которого нет на странице, чтобы начать, я могу легко открыть firebug и начать отладку, чтобы найти значение. Если вы должны иметь безопасность, не подвергайте данные. Даже шифрование данных не поможет, потому что ключ, вероятно, будет где-то в javascript.

Возможно, если вы поделитесь своей проблемой, тогда мы сможем подумать о лучшем решении. Вероятно, Javascript не самый лучший вариант здесь.

Редактировать, используя отладчик, вы можете сделать что угодно! Скриншот alt text

+0

На самом деле это вопрос, можете ли вы получить super_secret с Firebug? Смею вас попробовать;) По крайней мере, я не смог найти его с Firebug или Webkit Inspector. – Mike

+0

Да, это очень просто. Поместите отладчик в firebug, а затем вы сможете получить доступ ко всем данным внутри объекта. –

+0

Вы сейчас говорите о просмотре сценария, который был оценен, или об объекте, хранящемся в памяти? Я говорю в памяти. Можете ли вы сказать мне, как именно и что мне нужно сделать, чтобы отлаживать оцененный объект, чтобы увидеть super_secret. – Mike

2

Предполагая, что это закончится запуском в браузере, кто-то может просто просмотреть исходный код и скопировать его (вы сказали «любые средства» :-).

Кроме того, если кто-то может получить произвольный Javascript для запуска на вашем сайте, сохранение секретности ключа является наименьшей из ваших проблем.

0

Единственное, что вы действительно можете сделать, это зашифровать и дешифровать super_secret, на стороне сервера. Если вы отправляете незашифрованные данные клиенту или предоставляете ему средства для расшифровки ваших данных, ваши данные доступны клиенту, и вы не должны полагаться на его скрытие.

+0

Это не сработает, потому что как вы собираетесь расшифровать его на стороне клиента? Если вы используете какой-то ключ, я могу искать этот ключ и расшифровывать данные. И если вы говорите, что только расшифруйте данные на сервере, то зачем отправлять его? –

+0

Ну, точно. Отправка его клиенту, как правило, плохая идея. Однако asp.net делает это с состоянием представления. Все, что я говорил, это единственное, что вы можете сделать безопасно, это хранить его на клиенте в зашифрованном виде, а не расшифровывать. – Jez

+0

ah ok, nevermind then. –