Como faço para que os campos de senha sejam preenchidos automaticamente sem a necessidade de interação do usuário?
Se eu inspecionar um<input type="password"/>
do meu script Tampermonkey e observe as alterações usando umchange
manipulador de um campo de senha preenchido pelo recurso Gerenciador de Senhas do Chrome, o valor permanece vazio até que eu efetue um clique real na página. Tentei no meu script clicar na página, mas o Chrome sabe que não é um clique real. Quando clico fisicamente na página, ochange
evento dispara repentinamente, o campo de senha recebe um valor e, em seguida, meu script reage corretamente (devido a ter ochange
evento). Mas eu escrevi esse script para evitar ter que interagir com a página em primeiro lugar, então isso derrota o ponto do meu script.
Existe uma maneira de fazer com que o TamperMonkey marque a página como tendo o usuário interagir com ela (por exemplo, algunsGM_setUserTouched()
ouGM_autoFillPasswords()
(API)) para que o recurso Gerenciador de Senhas realmente preencha<input type="password"/>
sem precisar que eu clique na página?
No Chrome, esse comportamento está documentado em# 352527 comentário 15 onde é um comportamento inesperado para o repórter e# 398805 em que há um caso em que o Chrome falha na implementação do comportamento que eu não quero. É considerado um recurso que, quando o preenchimento automático e o Gerenciador de Senhas incorporado do Chrome preenchem um formulário, os caracteres da senha são exibidos para o usuário no campo de senha, mas o DOMHTMLInputElement.value
está configurado para""
. Quando o usuário interage com a página, como clicando nela ou pressionando uma tecla, o Chrome modificaHTMLInputElement.value
para conter a senha e umchange
evento é disparado no elemento A razão citada para fazer isso é "razões de segurança" (por exemplo, se um script de site estivesse lendo o elemento de senha, ele só teria a chance de fazê-lo se o usuário estivesse olhando a página ... para popunders ou frames não visíveis não seria capaz de fazer isso ou algo assim?Não tenho certeza do que isso protege você: assim que o usuário interagir com a página, todos os scripts terão acesso à senha de qualquer maneira. E se scripts ruins estiverem sendo veiculados da mesma origem que o<input type="password"/>
, o site em si tem uma falha de segurança, não o Chrome…)
Greasemonkey historicamente temAPIs auxiliares e um@grant
sistema para permitir que o userscript resolva problemas como este. Editar: ao criar o repro (abaixo), descobri que o Firefox disponibiliza a senha de preenchimento automático para o DOM sem esperar o usuário interagir com a janela. Portanto, Greasemonkey não precisa de umGM_forceAutofill()
API porque o Firefox não exibe essa peculiaridade do Chrome. Como resultado, o Tampermonkey não possui essa API.
Como as pessoas não acreditam em mim quando descrevo o comportamento exibido pelo Chrome, preparei uma reprodução. É preciso algum trabalho para que o Chrome chegue a um estado em que ainda não pense que o usuário tenha interagido com a página, mas você poderá ver o que vejo usando estas etapas:
Abra o Chrome. Estou usando o Chrome 61.0.3163.91 de 64 bits no Windows 10.Navegar parahttps://fiddle.jshell.net/xqfynp3e/22/show/light/Digite algum nome de usuário e senha falsos e pressione Enter ou clique no botão. O Chrome deve solicitar que você salve a senha.Salve a senha.Abra as ferramentas do desenvolvedor.Digite isso no console (para navegar até a página sem interagir acidentalmente com ela):window.location.href = 'https://fiddle.jshell.net/xqfynp3e/22/show/light/?1'
Corredocument.querySelector('input[type=password]').value
no console.Observe aquiloa senha do formulárioaparece ser preenchido visualmente e ainda assim ler o elemento DOM no Console produz""
.Clique no documento.Corredocument.querySelector('input[type=password]').value
no console novamente.Observe aquiloa senha do formulário não mudou de aparência, e a leitura do elemento DOM no console gera a senha falsa que você salvou.Minha pergunta, reafirmada: como posso fazer com que o Tampermonkey execute a etapa "Clique no documento"? Como posso informar ao preenchimento automático de senha do Chrome que interagi com a página sem realmente interagir fisicamente com a página?
EDIT: Encontrei uma maneira alternativa de armazenar com segurança senhas no Chrome e acessá-las por meio de scripts de usuários usando o suporte à mediação silenciosa da API da web de credenciais:https://imgur.com/a/ts2W1