Jump to content

Reenvio de formulário


Carlos Rocha
 Share

Recommended Posts

Podes guardar o IP.

Em teoria sim, mas na prática, se o fizeres, estás a bloquear outras pessoas dentro da mesma rede de o fazerem.

Podes colocar um cookie, mas se o utilizador apagar os cookies ou utilizar outro browser vai conseguir re-submeter.

Podes utilizar um sistema de contas de utilizador, mas se o utilizador criar mais que uma conta vai conseguir re-submeter.

Edited by KTachyon

“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Link to comment
Share on other sites

Não existe nenhuma forma garantida de impedires isso. Podes dificultar, mas não podes impedir.

“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Link to comment
Share on other sites

Parem de dizer asneiras... engenheiros... bah!!! 😕

A verdade é que estás a fazer um novo pedido de POST ao servidor. Tudo depende da forma como o servidor entende o pedido (REQUEST).

Usando uma linguagem server-side que irá "interpretar" o pedido, poderás alterar a forma como o POST vai ser processado. Poderias gerar um "token" na sessão do utilizador (algo que identifique o pedido), e assim identificar se o pedido é repetido ou não. Atenção que poderá haver outras técnicas, apenas falo de uma.

NOTA: A submissão de um formulário, poderá ser especificada por HTML através na propriedade method, ou por uma linguagem script no lado do cliente como por exemplo, Javascript, (ou ECMA script, depende da forma como queiram valorizar o trabalho das organizações que estão a trabalhar nos contextos).

O que é importante reter, é que a solução para o teu problema depende da forma como o pedido é "entendido" quando chega ao servidor 🙂

NOTA 2: e eu não sou engenheiro... é triste :/

Edited by taviroquai
Link to comment
Share on other sites

Uhh... I'm soooo bad ass!

É um sistema de votos, como é que consegues garantir que vais dar o mesmo token ao mesmo utilizador da próxima vez que ele aceder à página, senhor não-engenheiro?

Claro que eu já sei que a tua resposta vai ser semelhante ao que eu disse em cima: cookies e contas de utilizador - portanto vou já agradecer-te por me dares razão. Moving on...

Edited by KTachyon

“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Link to comment
Share on other sites

Como eu disse, tu não consegues impedir que uma pessoa vote mais que uma vez, mas podes dificultar o processo. Se o sistema é anónimo podes utilizar um sistema de cookies, se o utilizador apagar o cookie ou utilizar outro browser, vai conseguir voltar a votar. Utilizar um token numa arquitectura em que tens sessões de utilizadores é desnecessário, porque tu, tendo a votação e o utilizador (pela sessão) não precisas de nenhum token para garantir que ele só está a votar uma vez. É uma chave composta, utilizador-votação.

O único caso em que o token faz sentido é apenas se os utilizadores forem anónimos (sem contas/sessões de utilizador) e tu fazes a distribuição com um token diferente para cada endereço de e-mail (por exemplo). Nesse caso o token identifica-te um utilizador único que vai realizar a votação (cá está, mais uma vez, o par utilizador-votação). Neste caso, se tu controlares a lista de endereços, então, sim... é possível que consigas garantir que os utilizadores só votam uma única vez.

Edited by KTachyon

“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Link to comment
Share on other sites

E coisa é mais simples que parece : O que é preciso é o seguinte:

Imagine o quadro aonde o usuário entra no sistema e lança 32 votos para o candidato X. e após o lançamento ele clikar f5, os dados serão reenviados. É apenas esta situação que desejo bloquear!

O caso de ele entrar com outro Browser ou entrar mais tarde e lançar a mesma quantidade de votas não é problema!

Entendem²

Link to comment
Share on other sites

Opa, @carcleo, guarda em sessão uma variável $_SESSION['voted'] = "nope". Na submissão do formulário... se $_SESSION['voted'] == "nope" então introduz e passa $_SESSION['voted'] para "yap". Perdes a sessão quando fechas o browser.

Se entendi bem, basta isto para implementar o que pedes.

"Que inquieto desejo vos tortura, Seres elementares, força obscura? Em volta de que ideia gravitais?" >> Anthero de Quental

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Linuxando.com | ...

Link to comment
Share on other sites

Com um refresh na pagina seria por exemplo a 2a introducao do form e ai nao passa no if $_SESSION['voted']=="nope" pois ja passaste a variavel para "yap". Ai reencaminhas para o index ou whatever e retornas algo como: "ja registamos o seu voto. Obrigado."

"Que inquieto desejo vos tortura, Seres elementares, força obscura? Em volta de que ideia gravitais?" >> Anthero de Quental

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Linuxando.com | ...

Link to comment
Share on other sites

É não funciona não. Pois se ele der f5 (refresh), como a a sessão é criada no incio da pagina ela receberá novamente o valor yap.

E, se eu mudar de página sem dar refresh, o valor da sessão será nope e então caso ele quiser dar votos para outro candidado não será possivel.

Então, coloquei assim:

<?php

 $alteraVotacaoString = "UPDATE candidaturas SET votos= votos + ".$_POST["votos"]." WHERE id =".$_POST["candidatura"];

 $alteraVotacaoQuery = mysql_query($alteraVotacaoString);

 if($alteraVotacaoQuery)
 {
echo "<h1 style='text-align:center'>Votos computados com sucesso!<br /></h1>";
echo "<h2 style='text-align:center'>Redirecionando em 5 segundos...<br /></h2>";
     header("refresh: 5; url=index.php?acao=form1");  
 }
 else
 {
echo "<h1 style='text-align:center'>Houve erro na operação!<br />Clique no botão abaixo para voltar!</h1>";
 }
?><br /><br />

<div style="text-align:center;"><a href="javascript:history.go(-1)" ><img src="voltar.png" title="Voltar" /></a></div>

Foi o melhor recurso!

Link to comment
Share on other sites

Nop. Nao estas a implementar isto como deve de ser. Le bem os posts anteriores. So implementas sessao se nao houver ja uma sessao. If (!isset(sessao)) { session start

$_SESSION['voted'] = "nope";

}

else {

// nao fazes nada pois ja ha sessao iniciada e nao vais reescrever as variaveis

}

Atencao a escrita pois estou no mobile.

Ve la com atencao pois estou certo que implementa o que pretendes.

Edited by Virneto

"Que inquieto desejo vos tortura, Seres elementares, força obscura? Em volta de que ideia gravitais?" >> Anthero de Quental

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Linuxando.com | ...

Link to comment
Share on other sites

Sim, eu li. Mas considere a seguinte situação:

if (!isset($_SESSION["votou"]))
{
 session_start();
 $_SESSION["votou"]=="nao");
}

if ($inclusao_no_banco)
{
 $_SESSION["votou"]=="sim")
}

Nesse momento,

$_SESSION["votou"]=="sim")

Correto?

Pressionando f5, a sessão estará criada e o usuário submeterá o form normalmente. Está errado?

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.