2015-05-18 2 views
3

У меня есть форма для входа, чтобы пользователь мог ввести свой пароль. Эта форма связана с моделью AngularJS. Предположим, что в соответствующем контроллере пользовательский пароль доступен через $scope.password.Как очистить чувствительную память в JavaScript?

Настоящая процедура входа в систему обрабатывается этой функцией: login($scope.email, $scope.password). После этой процедуры логика приложения больше не нуждается в пароле, и я хочу удалить ее из памяти браузера.

Для меня наиболее очевидный вопрос: что я могу сделать сразу после вызова login($scope.email, $scope.password), чтобы очистить память, удерживая значение, которое в настоящее время связано с $scope.password? Надеюсь, этот вопрос применим для JavaScript в целом.

Но тогда, следуя отсюда, у меня есть еще два AngularJS-специфические вопросы:

  • это пароль значение формы связаны с более AngularJS-внутренних переменных, чем просто $scope.password? В этом случае переопределение $scope.password не помогло бы.

  • При переключении вида контроллер, соответствующий старому представлению, и его область действия становятся «разрушенными». Должен ли я просто полагаться на сборку мусора, чтобы очистить память, содержащую пароль, в течение короткого промежутка времени после перехода от входа в систему?

+2

Какова проблема, которую вы пытаетесь решить? Вы не можете сделать это в JavaScript, действительно, поскольку среда выполнения не обеспечивает контроля над тем, что происходит с строковыми примитивами, когда они собирают мусор. – Pointy

+0

@Pointy: Я принимаю, что «очистка пароля из памяти обычно не выполняется или не может быть надежным способом» в качестве ответа, если это то, что вы пытаетесь сказать. Это первое расширенное клиентское приложение на основе JavaScript, над которым я работаю, и, конечно же, меня интересует подход с лучшей практикой. –

+0

Дело в том, что веб-приложение должно полагаться на набор связанных с безопасностью поведения, которые должны быть должным образом реализованы клиентскими браузерами. Такие вещи, как защита от запросов на межсайтовый сайт и правильная реализация безопасности файлов cookie, - это то же, что и ваш код. Каждое окно (ну, каждое семейство окон) получает изолированную среду выполнения JavaScript. Кроме того, поскольку нет распределения памяти с низким уровнем сырых массивов, нет никакой возможности сканировать свободную память (без использования ошибки браузера). – Pointy

ответ

7

Поскольку ничто в различных сценариях, связанных с веб-браузером, не делает обязательств относительно содержимого браузера, вы никогда не сможете быть уверены в том, что вы очищаете память.

Рассмотрим простой код JS:

x=1234; 
x=5678; 

Даже в таком простом фрагменте кода у Вас нет никакой гарантии, что вы на самом деле удалены 1234 из памяти. Все, что вы знаете, это то, что когда вы ссылаетесь на x, его значение будет 5678. Вы не знаете, перезаписал ли 56781234 или был записан в новое место памяти.

Точно так же после того, как пользователь ввел свой пароль в ответ на форму, содержащую:

<input type="password" name="p"> 

У вас нет гарантии, что вы можете когда-либо стереть память затаив пароль; даже если вы снова запустите форму.

Единственный способ обойти эти ограничения - написать толстый клиент, который запускается как настольное приложение или плагин для браузера.

Обратите внимание, что ни одно из указанных выше не означает, что браузеры неаккуратные с секретами в своей памяти. Как правило, они стараются предотвратить уязвимости памяти. Просто вы не понимаете, что они делают и как вы можете использовать его. Даже если бы вы это сделали, это было бы специфично для каждой версии браузера.

Итак, если вы не чувствуете, что вам нужно защитить пароль больше, чем, например, ваш банк, используйте тот факт, что вы должны помещать пароли своих пользователей в надежные надежные руки браузера.

0

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

Чтобы отправить пароль, вы можете использовать стандартную форму для входа, ответ заставит браузер извлечь новую страницу, и вся существующая память с паролем игнорируется.

+1

Вопрос об очистке пароля из памяти. Вы не контролируете управление памятью в браузере. То, что вы предлагаете, в лучшем случае освобождает память. Конечно, это не ясно. Сканирование памяти или дамп процесса могут содержать пароль в текстовом виде. –

+0

Правда. Риск, с которым я говорил, - это ошибка в приложении на стороне клиента, которая может читать переменную javascript, содержащую пароль после отправки пароля. т.е. alert (pwVar); Выбирая отдельную среду исполнения для приложения и форму пароля, вы исключаете возможность проскальзывания переменной. – Jonathan

Смежные вопросы