-1

Formulários mais seguros com synchonizer token (ficha sincronizadora)

criado por Rogério Bragil em 22/09/2005 1:57pm
O princípio da ficha sincronizadora é o seguinte: a ficha é uma variável criada no início da sessão, com um valor inicial estabelecido pelo desenvolvedor (pode ser um valor aleatório usando uniqid(), rand(), time(), etc...). Vamos usar sessions para exmplificar (se você não sabe usar sessions, procure por um tutorial aqui no PHPBrasil).

Para um site com autenticação, você pode inicializar o valor da ficha no ato do login, depois de certificar que o usuário é válido:

<?
session_start( );
...

// inicializa a ficha sincronizadora com um valor aleatório
$_SESSION["synctoken"]= uniqid(time( ));

....
?>


Muito bem, com nossa ficha sincronizadora registrada na sessão, podemos exemplificar como criar um formulário protegido por ela:

<form name="frmteste" method="post" action="cadastro.php">
...
<!-- coloca todos os campos do formulário -->
<!-- a nossa ficha fica como um campo hidden -->
<input type="hidden" name="token" value="<?=$_SESSION["synctoken"]?>">
...
</form>


Ok, se você acessar o formulário pelo browser e pedir para visualizar o código-fonte, vai notar que o atributo value do campo token possui um valor esquisitão, tipo 45jfg58955699j96uy8gtj85. Tudo certo, até aqui.

A mágica acontece ao processar o formulário. No nosso exemplo, o action do formulário é o arquivo cadastro.php. Neste arquivo, ao receber os dados do formulário, você deverá testar se o valor do campo token do formulário é o mesmo que o da variável de sessão $_SESSION["synctoken"]. Caso não seja, é sinal de que tem algum desocupado tentando fazer o que não deve, ou seja, provavelmente é alguém que salvou a página com o formulário no seu micro e está tentando fazer alguma "arte". Neste caso, você pode fazer algumas coisas, como coletar o IP do cidadão, exibir uma frase intimidadora, etc... Fica a seu cargo. Se o valor for igual, sinal verde, pode continuar com o processamento.

Após o teste, atribua outro valor a variável de sessão
$_SESSION["synctoken"]:

// pode ser assim, ou só com time( ), ou com rand( )... Você escolhe!
$_SESSION["synctoken"]= uniqid(time( )); 


Tudo ok! Sua ficha sincronizadora está pronta para outro formulário.

Comentários:

Mostrando 1 - 10 de 33 comentários
Humberto Cruz disse:
Pois é Adir, eu concordo com você. Mas tem casos que o token deve ser utilizado. Quando os domínios da aplicação e do sistema de login são diferentes por exemplo.
16/04/2013 12:02pm (~3 anos atrás)

Thiago Rocha disse:
E aí Bragil!
Foi uma excelente dica essa sua, gostei muito e vou começar a usar.
Usava outras tecnicas, mas achei essa mais interessante.
Tb vale ressaltar que o comentário do "Alexandre" foi muito positivo tb.
É bom ver a galera contribuindo e ajudando uns aos outros.
Vlw!
25/08/2006 6:44am (~10 anos atrás)

Luiz Junior disse:
Não entendi muito bem os metodos que utilizam MYSQL, poderia dar uma clareada?
11/05/2006 1:48am (~10 anos atrás)

Luiz Junior disse:
Ao invéz de utilizar tokens, não se podem também checar o HTTP_REFERER? Se o formulário tiver sido POSTado por um FORM em seu dominio, o HTTP_REFERER possuirá um valor valido.
10/05/2006 12:49pm (~10 anos atrás)

Olá Herbert!

Você tem razão, os dados passarão sim... Foi um pequeno erro meu... De qualquer forma, a sessão só valerá nesse caso, se você salvar a página e já postar os dados. Entretanto, se você salvar a página para mais tarde tentar postar, com certeza não será possível... Além disso, essa técnica evita a postagem repetida se o usuário clicar no botão submit por duas vezes.

Bom, como eu já falei, é uma técnica que aumenta a segurança e a coesão do sistema, porém você pode e deve usar outras técnicas em conjunto...

Falow!

bragil
13/03/2006 9:08am (~10 anos atrás)

Rogério, esse lance de token é ótimo e estou querendo usar, porém eu ainda não consegui ver segurança nele;

se eu gerar o formulário, salvar a página no micro e enviar os dados (sem fechar a janela do site), os dados irão passar, pois a SESSION atual ainda existe (pois a janela do formulário do site não foi fechada). O esquema de segurança só funciona se a SESSION do servidor for destruída! Tem idéia de como isso pode ser resolvido?
13/03/2006 8:28am (~10 anos atrás)

César disse:
não seria interessante utilizar cookies + sessions?
digo.. sendo os cookies gravados no cliente e sessions no servidor, ao carregar a pagina, seria feita uma gravação dos cookies e sessions, e depois disso, verificamos estes dados.

podemos pegar o dado da ficha, aplicar um md5 (para maior segurança) e aplicar ele como hidden nos formulásrio e endereços, fazendo uma posterior verificação com os com os dados de cookies e sessions (após aplicar o md5 também)

Acredito que assim fica mais um pouco seguro.. hehe

até..
06/01/2006 11:09am (~11 anos atrás)

Sim, david07... você pode fazer esse esquema em qualquer formulário... Além disso, incremente o seu form com aquelas imagens contendo um código que o cara tem que digitar em um campo de texto... No pear.php.net tem um classe para gerar essas imagens, se não me engano chama-se Text_captcha


Falow!

bragil
07/12/2005 10:22am (~11 anos atrás)

david07 disse:
Essa dica vale para um formulário simples de um pagina de contatos? Estou sofrendo com esses lammers
07/12/2005 10:17am (~11 anos atrás)

Taober, dessa forma qualquer mané pode acessar nosso formulário... Sim, é necessário uma "cópia" da session, pois sem ela sempre vai ser OK, visto que o código que recebe os dados do form vai verificar a presença da sessão e sempre vai dar sinal verde. Uma ótima alternativa ao hidden é manter a cópia no banco de dados.

Falow!
21/11/2005 5:41am (~11 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)