Jump to content


Photo

Cookie


  • Faça o login para participar
6 replies to this topic

#1 marsil

marsil

    Novato no fórum

  • Usuários
  • 6 posts
  • Sexo:Não informado

Posted 05/03/2006, 16:37

Estou desenvolvendo uma enquete para um site, que permite que a pessoa vote uma única vez por dia. Quando alguém tenta votar pela primeira vez, eu instalo um cookie no computador dela:

setcookie($nomedocookie,$valor,time()+31536000);

onde $valor corresponde a um número gerado pela seguinte função:

$valor=mt_rand(1000000000,9999999999); // gera número com 10 dígitos

Esse número é guardado então no mysql, junto com a data. Quando a pessoa tenta votar novamente, eu pego o valor do cookie usando:

if (isset($_COOKIE['nomedocookie']))
{
$valordocookie=$_COOKIE['nomedocookie'];
}

o $valordocookie é então validado, checando cada caractere por valores que não sejam numéricos e usando a função

$valordocookie=substr($valordocookie, 0, 10);

para evitar que alguém altere o cookie e entre com uma string maior do que 10 caracteres.

Então eu comparo o $valordocookie com o número guardado no mysql. Se o número já existe no mysql e a data não é a de hoje, o voto é computado.

O problema é que um usuário tem conseguido alterar o valor do cookie com números de até 20 dígitos e votar à vontade. Mas se eu abro o cookie aqui em casa usando o bloco de notas e altero o valor dele para qualquer número com mais de 10 dígitos, o isset não reconhece mais o cookie e não me deixa votar. Alguém tem idéia de como essa pessoa pode estar alterando o valor do cookie e burlando a validação do substr?

Marcelo

#2 Goku Jr

Goku Jr

    Nilson

  • Usuários
  • 3757 posts
  • Sexo:Masculino

Posted 05/03/2006, 17:15

o isset só verifica se existe a variavel.. se você está gravando um VALOR que é NÚMERICO , então verifique com o is_numeric ou valida o valor do cookie usando ER
if (eregi(^[0-9],$_COOKIE['campo'])) {

estou lhe dando somente um exemplo de ER ;)

Mestres de ERs ( Vidaloka e Eclesiastes ) estaria certo a forma de verificar um valor númerico usando a ER ? :unsure:

T+
-----------------------------------------------------------------------
PALMEIRAS - Primeiro campeão do mundo em 1951

#3 _AleMAuM_

_AleMAuM_

    Turista

  • Usuários
  • 26 posts
  • Sexo:Não informado

Posted 06/03/2006, 01:33

Eaw marsil, bele?

Seguinte, bagunca a vida dele, usa base_encode64 e base_decode64 nos valoer do cookie para complicar a vida deles!
Mas tem um porem, cookie voce apaga a hora que voce quizer da sua maquina, entao o melhor seria voce guardar no mysql o ip com a data, ai voce faz uma query filtrando qq resgistro com menos de 24hrs e verifica se ele ja votou.
Vai ser um pouco mais seguro, ja que internet de alta velocidade normalmente mantem o ip por algums dias, mas discada ai dano, ou usar essa maneira que eu te passei com o cookie tbm!!

Fica a seu criterio!

Talvez eu nao tenha sido muito claro, qq duvida da um toque!

Flws guri!!
Eu uso Zend Development Environment!

#4 Goku Jr

Goku Jr

    Nilson

  • Usuários
  • 3757 posts
  • Sexo:Masculino

Posted 06/03/2006, 07:37

se o cara estiver atraz de PROXY ou numa rede ( igual do Ruindows XP -> configurar uma rede de pequena ou média empresa , algo do tipo ) ele irá gravar somente o IP de INTERNET assim o cara ou quem + for querer votar não irá conseguir, assim perdendo votos até que "válidos"

acho que com COOKIE seria melhor... mesmo porque você impede que aquele computador VOTE outra vez.. mesmo que o usuário troque de micro e vote novamente, pelo menos você evita de varios micro não votarem no dia só porque um micro votou.

T+
-----------------------------------------------------------------------
PALMEIRAS - Primeiro campeão do mundo em 1951

#5 Felipe Pena

Felipe Pena

    O temor do Senhor é o princípio da sabedoria

  • Ex-Admins
  • 6441 posts
  • Sexo:Masculino

Posted 06/03/2006, 07:57

Goku Jr
Você fez:
^[0-9]

Isso casará também com: 1testando
Você precisa dizer que você quer encontrar número do começo ao fim, e que pode ser apenas um ou maior que 1 caracter, ou seja, que seja realmente número(s).

^[0-9]+$

E como o manual diz, opte pela agilidade da preg_match().
Felipe Pena
[...] ó terra, terra, terra; ouve a palavra do Senhor. — Jeremias 22:29

#6 gonacts

gonacts

    "Agora eu tb tenho um Tux..." =D

  • Usuários
  • 1030 posts
  • Sexo:Não informado

Posted 06/03/2006, 08:17

pq q ao inves de vc prender o voto dele pelo cookie q foi setado vc nao amarra pelo ip ?!

assim vc nao deixa mais de um voto por dia para akele determinado ip...seria uma outra forma, ja q o usuario poderia estar tb limpando os cookies...

sako!?

procure no forum , tem varios assunto sobre isso!! :lol:
"Ninguém é tão inteligente que não possa aprender e ninguém é tão burro que não possa ensinar.."
"As dúvidas engrandecem nossa sabedoria, mas não basta somente tirá-las, temos que entendê-las"

#7 marsil

marsil

    Novato no fórum

  • Usuários
  • 6 posts
  • Sexo:Não informado

Posted 06/03/2006, 18:31

Olá,

obrigado pela ajuda até agora. Eu preferi usar cookie ao invés do IP por causa dos IPs dinâmicos que mudam a cada conecção. Vou tentar codificar a validação do cookie com a ER e ver se resolvo o problema.

Até agora eu estava usando um switch pra validar, mas parece que não está funcionando. Alguém saberia me dizer qual o problema com essa validação que eu estava usando?

//
//
$value=$_COOKIE['nomedocookie'];
$valuetrim=trim($value); // REMOVE OS ESPAÇOS
$value=substr($valuetrim, 0, 10); /* LIMITA O VALOR DO COOKIE A NO MAXIMO 10 CARACTERES */

$numerodecaracteres=strlen($value); /* PEGA O NUMERO DE CARACTERES DO VALOR DO COOKIE */

$i=0;
while ($i < $numerodecaracteres)
{
$cadacaractere=substr($value,$i,1); /* PEGA CADA CARACTERE DA STRING DO COOKIE VALUE */

switch ($cadacaractere) { /* CHECA CADA CARACTERE. */
case "1" : $cookievalido=1;
break;
case "2" : $cookievalido=1;
break;
case "3" : $cookievalido=1;
break;
case "4" : $cookievalido=1;
break;
case "5" : $cookievalido=1;
break;
case "6" : $cookievalido=1;
break;
case "7" : $cookievalido=1;
break;
case "8" : $cookievalido=1;
break;
case "9" : $cookievalido=1;
break;
case "0" : $cookievalido=1;
break;
default : $cookievalido=0;
$i=$num; // MATA O LOOP SE ENCONTRAR UM CARACTERE INVALIDO
break;
}
++$i;
}

if ($num!=10) /* VALOR DO COOKIE NAO TEM 10 CARACTERES: COOKIE INVALIDO */
{
$cookievalido=0;
}

if ($cookievalido==1)
{ // DEIXA VOTAR }
if ($cookievalido==0)
{ // ANULA O VOTO}
//
//
Eu não estou entendendo, pois eu achei que esse código limitaria o tamanho do valor do cookie a 10 digitos. No entanto, tem um usuario conseguindo manuseando o valor do cookie e votando com qualquer número, inclusive números de 20 dígitos. Como ele pode estar fazendo isso? Será que pode ser através de SQL injection?

Obrigado mais uma vez pela ajuda.

Marcelo

Edição feita por: marsil, 06/03/2006, 18:32.





1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq