Comment effacer la mémoire sensible en JavaScript?

J'ai un formulaire de connexion pour qu'un utilisateur saisisse son mot de passe. Cette forme est liée à un modèle AngularJS. Supposons que dans le contrôleur correspondant, le mot de passe fourni par l'utilisateur est disponible via $scope.password .

La procédure de connexion réelle est gérée par cet appel de fonction: login($scope.email, $scope.password) . Après cette procédure, la logique de l'application n'a plus besoin du mot de passe et je souhaite la dégager de la mémoire du navigateur.

Pour moi, la question la plus évidente est la suivante: qu'est-ce que je peux faire immédiatement après la login($scope.email, $scope.password) afin d'effacer la mémoire contenant la valeur à laquelle $scope.password est actuellement lié? Cette question est valable pour JavaScript en général, j'espère.

Mais, suite à cela, j'ai deux questions plus spécifiques à AngularJS:

  • La valeur de la forme du mot de passe est-elle liée à plus de variables internes AngularJS que de seulement à $scope.password ? Dans ce cas, la $scope.password ne serait pas utile.

  • Lors de la commutation de la vue, le contrôleur correspondant à l'ancienne vue et son champ d'application devient "détruit". Dois-je simplement compter sur la collecte des ordures pour effacer la mémoire contenant le mot de passe dans un court intervalle de temps après avoir éloigné de la vue de connexion?

Comme rien dans les différents scénarios liés au navigateur Web ne prend des engagements concernant le contenu de la mémoire du navigateur, vous ne pouvez jamais être sûr que vous effacez la mémoire.

Considérons le code JS simple:

 x=1234; x=5678; 

Même dans un tel extrait simple, vous ne garantissez pas que vous avez supprimé 1234 de la mémoire. Tout ce que vous savez, c'est que lorsque vous faites référence x sa valeur sera de 5678 . Vous ne savez pas si 5678 remplacé 1234 ou a été écrit dans un nouvel emplacement mémoire.

De même, une fois que l'utilisateur a entré son mot de passe en réponse à un formulaire contenant:

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

Vous n'avez aucune garantie que vous pouvez effacer la mémoire qui retient leur mot de passe; Même si vous exécutez le formulaire à nouveau.

La seule façon de contourner ces limites est d'écrire un gros client exécuté sous la forme d'une application de bureau ou d'un plugin de navigateur.

Notez qu'aucun des éléments ci-dessus ne signifie que les navigateurs sont déguisés par des secrets dans leur mémoire. Ils essaient généralement d'empêcher les vulnérabilités d'examen de mémoire. C'est juste que vous n'avez aucune idée de ce qu'ils font et de la façon dont vous pouvez tirer parti. Même si vous l'avez fait, ce serait spécifique à chaque version du navigateur.

Donc, à moins que vous ne sachiez que vous devez protéger le mot de passe plus que, par exemple, votre banque, utilisez le fait que vous devez mettre les mots de passe de vos utilisateurs dans les mains (espérons) fiables du navigateur.

Utilisez des tableaux binaires / dactylographiés. Remplissez le tableau avec des zéros lorsque vous devez anéantir les données en mémoire.

S'il s'agit d'un risque réel pour votre application, votre seul choix réel est de créer une page de connexion distincte de l'application.

Vous pouvez utiliser un formulaire de connexion standard pour soumettre le mot de passe, la réponse forcera le navigateur à récupérer une nouvelle page et toute la mémoire existante avec un mot de passe est ignorée.