Enviar dados para o mesmo formulário é um bom método? – php html

Pergunta:


Eu tenho um formulário de login, que após dado submit ele é enviado para si mesmo com as informações via POST, e caso esteja errado, ele exibe uma mensagem de erro e mostra novamente o mesmo formulário. Fiz dessa forma para evitar criar páginas tipo: login.php, validalogin.php.

Fico me questionando se foi um bom método, pois reduzi o número de páginas, porém quando o usuário aperta F5 a página reenvia novamente todos os dados. Se esse for um bom método, é possível corrigir o problema do F5?

Autor da pergunta Latrova

Flávio Granato

Uma outra forma de contornar isso e também garantir um pouco mais de segurança é utilizar um token de submit.

Exemplo: Quando alguém pedir a tela de login você cria um token, exemplo um uuid guarda e envia em hide no formulário. Assim que o formulário for enviado você verifica se ele existe na sua lista e marca como usado. Desta forma se o mesmo token for reenviado algumas vezes você não o reprocessará novamente.

Começa a melhorar a segurança também, lógico que vai muito mais além que o que exponho aqui, se alguém forjar o request da sua página com um scam, spam seja lá o que mais o atacante usar, você vai “garantir” que aquele formulário foi criado por seu sistema “e” que o token usado você o conhece, logo é uma boa situação. Assim se o atacante tentar enviá-lo novamente não terá sucesso pois o token já foi utilizado.

Mais sobre o ataque de CSRF

É uma boa estudar os ataques top ten do OWASP, pois lá tem o problema e uma forma de solucionar os problemas.

Creio que isso pode ser contornado através de uma redireção. Faça um POST para seu formulário e, em caso de falha, faça um redirect (302) para si próprio – passando na query string os parâmetros de renderização (i.e. qual mensagem de erro que é para exibir). Assim o browser vai fazer um GET para o mesmo formulário, mostrar a mensagem como você quer, e se o usuário fizer F5 o browser simplesmente vai repetir o GET.

O único inconveniente, creio, é que após o F5 as mesmas mensagens de erro serão exibidas, a menos que você limpe a query string via JavaScript após a exibição do formulário.

Creio que este é um bom método.

Do ponto de vista funcional, não há problemas em deixar a tecla F5 reenviar os dados de login no caso da autenticação falhar. A operação é idempotente.

Entretanto, do ponto de vista de usabilidade, talvez seja melhor evitar isso e seguir a orientação do @mgibsonbr e fazer um redirect para si mesmo.

Além da query string, uma outra alternativa já usada em outras linguagens para que a mensagem de falha de login sobreviva a um, e somente um, redirect é usar o conceito de mensagens flash. Nunca usei em PHP, mas este artigo possui uma descrição de como implementar isso.

Por outro lado, é possível também um esquema de autenticação via Ajax para evitar toda essa complexidade.

Quando o usuário clicar no botão de submit do formulário de login, faça uma chamada Ajax POST que retorne uma flag de sucesso ou falha. Se ocorrer falha, mostre em um campo na tela. Se ocorrer sucesso, faça via Javascript o redirecionamento para a página principal usando window.location.href. É uma solução bem simples, principalmente se você usa jQuery.

Como um bônus, você pode ainda implementar as duas soluções simultaneamente, sendo a versão Ajax adicionada na página de forma não obstrutiva. Se o javascript estiver desabilitado, o login funciona da forma “tradicional”.

Fonte

Related Posts:

Qual a diferença entre AppCompatActivity e Activity? – android android-activity
Pergunta: Qual a diferença da AppCompatActivity para Activity ? A partir de qual versão a AppCompatActivity foi adicionada ao Android? Autor da pergunta Luhhh A diferença reside ...
Como abreviar palavras em PHP? – php string
Pergunta: Possuo informações comuns como nome de pessoas e endereços, e preciso que elas contenham no máximo 30 caracteres sem cortar palavras. Exemplo: 'Avenida Natalino João Brescansin' ...
Qual é a finalidade de um parêntese vazio numa declaração Lambda? – c# expressões-lambda característica-linguagem
Pergunta: Criei um exemplo de uma declaração Lambda sem argumentos, entretanto, estou com duvidas referente a omissão do parêntese vazio () na declaração. Veja o exemplo: class ...
Boas práticas para URI em API RESTful – api rest restful
Pergunta: Estou com dúvida em relação às URIs de alguns recursos da api que estou desenvolvendo. Tenho os recursos projetos e atividades com relação 1-N, ...
Dúvidas sobre a integração do MySQL com Java – java mysql netbeans
Pergunta: Estou criando um sistema no NetBeans, utilizando a linguagem Java e o banco de dados MySQL. Escrevi o seguinte código para realizar a conexão ...
Qual é a finalidade da pasta Model do framework Inphinit? – php inphinit
Pergunta: No Inphinit micro-framework existe a pasta Model que fica dentro da pasta application, e nela é onde ficam as classes, mas eu estou muito ...
Uso do ‘@’ em variáveis – javascript typescript coffeescript
Pergunta: Vejo em algumas linguagens que compilam para javascript, como TypeScript e CoffeeScript, o uso do @ em variáveis, como também, casos em que o ...
Qual tamanho máximo um arquivo JSON pode ter? – json arquivo
Pergunta: Vou dar um exemplo para conseguir explicar minha duvida: Preciso recuperar informação de imagens vindas de uma API, esse banco de imagens me retorna JSON's ...
O que é Teste de Regressão? – terminologia engenharia-de-software testes
Pergunta: Na matéria de Teste de Software o professor abordou um termo chamado Teste de Regressão, isto dentro da disciplina de teste de software. Sendo ...
O que é um construtor da linguagem? – php característica-linguagem
Pergunta: Em PHP, já li e ouvi várias vezes a respeito dos Construtores da Linguagem. Os casos que sempre ouvi falar deles foi em casos ...
Função intrínseca para converter numérico para string – cobol
Pergunta: Estou a tentar saber se existe alguma função intrínseca do COBOL para converter um data numérico para string sem precisar usar a cláusula REDEFINES: ( ...
Porque usar implements? – java android
Pergunta: Qual a diferença entre usar btn.setOnClickListener(new OnClickListener() { e public class MainActivity extends Activity implements OnClickListener{ Estive fazendo um curso de Android e meu professor falou que ...
O que é XHTML e quando deve ser usado? – html xml xhtml
Pergunta: O que eu sei é que o XHTML precisa ser XML válido. Isso implica, por exemplo, que todas as tags precisam ser fechadas. Por ...
Uma placa aceleradora de vídeo pode melhorar o desempenho não-gráfico? [fechada] – desempenho
Pergunta: Para desenvolver em Ruby on Rails, eu utilizo aqui uma máquina virtual do VirtualBox com Ubuntu Server 14.04 sem interface gráfica instalada. Recentemente descobri uma ...
Concat() VS Union() – c# .net
Pergunta: Qual a diferença entre Concat() e Union() ? Quando usar Concat() e quando usar Union() ? Somente pode ser usado em list ? ...

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *