Evitando o "autocomplete" de navegadores

Artigo que apresenta uma solução para evitar que os navegadores apresentem sugestões automáticas sobre campos textuais (autocomplete), especialmente em campos altamente confidenciais e/ou inseguros.

Introdução

Sistemas Dinâmicos Web normalmente são repletos de formulários. Em alguns deles, é útil que o navegador ofereça sugestões de preenchimento automático baseado no histórico de preenchimento de determinado campo. Normalmente os navegadores gravam estes tipos de informação de acordo com o valor do atributo "name" do input de texto (e, talvez, de acordo com a URL em que o campo foi gerado).

Porém, em alguns campos, não desejamos este recurso por uma questão de segurança e/ou confidencialidade.

Para resolver isso, existem algumas soluções:

  • Usando o atributo (não oficializado pela W3C) autocomplete="off";
  • Gerando o valor do atributo "name" dinamicamente.

Incluir autocomplete="off" no input de texto funciona em alguns navegadores (não todos) e não é um atributo oficializado pela W3C. Então programadores podem usar de acordo com seus valores.

A solução de gerar o "name" dinamicamente é relativamente simples: você gera o name baseado no timestamp (por exemplo), e coloca no input de texto. No mesmo formulário, você pode colocar um input hidden com o valor do name do input de texto e, no PHP, você verifica este valor para recuperar o campo de texto. Outra possibilidade é gravar esse name em sessão e utilizá-lo para recuperar o outro valor. Veja os exemplos abaixo para gerar um campo de texto que será preenchido com CPF:

Usando um input hidden

// Trecho que gera o formulario
if (isset($_POST['nome_campo_cpf'])) {
    $name = $_POST['nome_campo_cpf'];
} else {
    $name = 'cpf'.time();
} 
echo '<input type="text" name="'.$name.'" />';
echo '<input type="hidden" name="nome_campo_cpf" value="'.$name.'" />';
// Trecho que obtem o CPF do formulario
if (isset($_POST[$_POST['nome_campo_cpf']])) {
    $cpf = $_POST[$_POST['nome_campo_cpf']];
} else {
    // O usuario provavelmente modificou o formulario e nao enviou o CPF corretamente
}

Usando sessão

// Trecho que gera o formulario
if (isset($_SESSION['nome_campo_cpf'])) {
    $name = $_SESSION['nome_campo_cpf'];
} else {
    $name = 'cpf'.time();
}
$_SESSION['nome_campo_cpf'] = $name;
echo '<input type="text" name="'.$name.'" />';
// Trecho que obtem o CPF do formulario
if (isset($_POST[$_SESSION['nome_campo_cpf']])) {
    $cpf = $_POST[$_SESSION['nome_campo_cpf']];
} else {
    // O usuario provavelmente modificou o formulario e nao enviou o CPF corretamente
}

Observação

Usar as duas soluções em conjunto também é válido.

2 comentários

Lucas disse...

Muito legal Rubens, eu sempre uso autocomplete="off", o editor que eu uso tambem não reconhecem esse atributo, sempre quando uso o atributo fica em vermelho, outro tambem que fica em vermelho é opacity do css.

Falou e ate mais.

Rubens Takiguti Ribeiro (autor do blog) disse...

Realmente, Lucas.
O opacity é uma propriedade prevista para o CSS 3, por isso ainda não fica em destaque em todos os editores. Já o autocomplete eu não sei se existe alguma previsão de oficializar.