Ir ao conteúdo
  • Cadastre-se

É possivel bular esse sistema de login


Posts recomendados

Bom fiz esse daqui que eu aprendi . só que vi no w3cschool que é perigoso sql injection. sei que dar pra bular mais coquer um consegue? Eu mesmo nao consigo o meu.

 

index.php

<?phpsession_start();if(!(isset($_SESSION['usuario']) == true) and (!isset($_SESSION['senha']) == true)){echo "<script>alert('voce nao esta Logado'); location.href='acesso.php';</script>";}else{	echo'<html lang="pt-br"><head><title></title><meta charset="utf-8"/><link rel="stylesheet" type="text/css" href="style.css"/></head><body><div class="hold_all">								<!--FORMULARIO 1 - CADASTRAR--><div class="hold-form"><form method="post"  action="cadastro.php" name="form"><table><span class="titles">CADASTRO DE PRODUTOS</span><br/><br/><br/><tr><th><label>Produto</label></th><td><input type="text" name="pr"/><br /></td></tr><tr><th><label>Quantidade</label></th><td><input type="text" name="qtd"/><br /></td></tr><tr><th><label>Valor</label><td><input type="text" name="valor"/><br /></td></tr><tr><th><label>Observações</label><td><input type="text" name="obs"/><br /></td></tr></table><input class="btn" type="submit" value="CADASTRAR"/></form></div>								<!--FORMULARIO 2 - PESQUISAR--><div class="hold-form2"><form method="post"  action="pesquisar.php" name="form"><span class="titles">PESQUISA DE PRODUTOS</span><br/><br/><br/><input type="text"  placeholder="Pesquisar Produto" name="buscar"/><input class="btn2" type="submit"  value="ir"/></form></div><div class="clear"></div></div><!--Fim Div Hold-ALL--></body></html>	';}?>

acesso.php

<?php?><html lang="pt-br"><head><title></title><meta charset="utf-8"/><style type="text/css">.hold-form-acesso{width: 280px; margin:200px auto; height: auto; border: solid 1px #111; box-shadow: 3px 3px 20px #000; }th{color:#FFF;}.hold-form-acesso form {width:auto; margin:0 auto; background: #ccc; background: url(img/back.jpg); padding: 10px; }.hold-form-acesso form input[type=text],input[type=password]{width: 200px; height: 30px; border-radius:10px;}.log{color:#0c0; font-weight: bold; font-family: calibri; font-size:20px; margin-left: 130px;}.btn{float: right; color: #fff; background: #090; border: none; width: 100px; height: 35px; -webkit-transition-duration:0.2s;}.btn:hover{background: #010;}</style></head><body>	<div class="hold-form-acesso"><form method="post" action="validacao_acesso.php"><table><span class="log">Login In</span><tr><th>Usuario</th><td><input type="text" name="usuario"/></td></tr><tr><th>Senha</th><td><input type="password" name="senha"></td></tr></table><input type="submit" class="btn" Value="Acessar"/><div class="clear" style="clear:both;"></div></form>		</div></body></html>

validacao_acesso.php

<?phpsession_start();include "conexao.php";$usuario = $_POST['usuario'];$senha = $_POST['senha'];$consulta = mysqli_query($conexao, "SELECT * FROM adm_usuario WHERE usuario='$usuario' AND senha='$senha'");$result = mysqli_num_rows($consulta);if($result == 0){echo "<script>alert('Usuario ou Senha Incorretos'); location.href='acesso.php'</script>";}else{	$_SESSION['usuario'] = $usuario;	$_SESSION['senha'] = $senha;	echo "<script>alert('Bem Vindo $usuario'); location.href='index.php'</script>";}?>
Link para o comentário
Compartilhar em outros sites

  • Moderador

@FabianoS

 

Burlar é possível sim.. qualquer um que tenha conhecimento.

Não dá para prevenir 100%.. mas o melhor que podemos fazer é dificultar usando algumas funções do php.. como por exemplo addslashes(), trim().. dentre outras

 

Você pode até criar uma função para isso.... por exemplo:

function protege($algo){   $algo = addslashes(trim($algo));   return $algo;}

A função addslashes() acrescenta barras  \  \   e a função  trim() retira os espaços do início e do fim. 

Claro que tu podes implementar mais coisas nessa função..  por exemplo acrescentar a função str_replace() para substituir coisas.. preg_match() para expressão regular..mysql_real_escape_string() .. enfim tem várias funções que podem ser usadas..  ali!

 

Sugestão, procura no google algumas funções de proteção contra sql injection.  tem vários sites mostrando algumas funções... use elas para estudar e aí criar uma função sua! :)

 

ps: procure utilizar algum tipo de criptografia nas senhas.. por exemplo md5., sha1, base_64..

 

Posso indicar o início do estudo:  

http://www.zoomdigital.com.br/sql-injection-o-que-e-e-como-evitar/

http://www.tizag.com/mysqlTutorial/mysql-php-sql-injection.php

Link para o comentário
Compartilhar em outros sites

@dif conseguir usar o str_replace(); mais coloquei dentro de uma função e criei o functions.php e chemei dele no cadastro.php

 

so que retorna erros;

 

 

xLvEPom.png?1

<?phpinclude('functions.php');include('conexao.php');$produto = $_POST['pr'];$qtd = $_POST['qtd'];$valor = $_POST['valor'];$obs = $_POST['obs'];$variaveis = $produto.$qtd.$valor;if(!empty($variaveis)){produto_replace();$insert = mysqli_query($conexao, "INSERT INTO tabela_grafica(produto,quantidade,valor,observacoes)VALUES('$produto','$qtd','$valor','$obs')") or die (mysql_error());echo"<script>alert('Cadastrado Com Sucesso.');location.href='index.php';</script>";}else{echo"<script>alert('Preencha os Campos Produto: Quantidade - Valor.');location.href='index.php';</script>";}?>

functions.php

$produto = str_replace('ã','a', $produto);$produto = str_replace('â','a', $produto);$produto = str_replace('ä','a', $produto);$produto = str_replace('à','a', $produto);$produto = str_replace('á','a', $produto);$produto = str_replace('õ','o', $produto);$produto = str_replace('ó','o', $produto);$produto = str_replace('ö','o', $produto);$produto = str_replace('ò','o', $produto);$produto = str_replace('ô','o', $produto);$produto = str_replace('ê','e', $produto);$produto = str_replace('é','e', $produto);$produto = str_replace('ë','e', $produto);$produto = str_replace('í','i', $produto);$produto = str_replace('ì','i', $produto);$produto = str_replace('ï','i', $produto);$produto = str_replace('î','i', $produto);$produto = str_replace('ú','u', $produto);$produto = str_replace('ù','u', $produto);$produto = str_replace('ü','u', $produto);$produto = str_replace('û','u', $produto);$produto = str_replace('ç','c', $produto);$produto = str_replace(' ','_', $produto);$produto = str_replace('/','-', $produto);$produto = str_replace('(','-', $produto);$produto = str_replace(')','-', $produto);$produto = str_replace('´','-', $produto);$pruduto = strtolower($produto);}
Link para o comentário
Compartilhar em outros sites

  • Moderador

@FabianoS

 

Não entendi..  o str_replace()  é usado para substituir strings e não imagens.

Além do mais, o arquivo functions.php não contém função.

Tem que fazer assim:

function substitui($produto){   $produto = str_replace('ã','a', $produto);   $produto = str_replace('â','a', $produto);   $produto = str_replace('ä','a', $produto);   $produto = str_replace('à','a', $produto);   $produto = str_replace('á','a', $produto);   $produto = str_replace('õ','o', $produto);   $produto = str_replace('ó','o', $produto);   $produto = str_replace('ö','o', $produto);   $produto = str_replace('ò','o', $produto);   $produto = str_replace('ô','o', $produto);   $produto = str_replace('ê','e', $produto);   $produto = str_replace('é','e', $produto);   $produto = str_replace('ë','e', $produto);   $produto = str_replace('í','i', $produto);   $produto = str_replace('ì','i', $produto);   $produto = str_replace('ï','i', $produto);   $produto = str_replace('î','i', $produto);   $produto = str_replace('ú','u', $produto);   $produto = str_replace('ù','u', $produto);   $produto = str_replace('ü','u', $produto);   $produto = str_replace('û','u', $produto);   $produto = str_replace('ç','c', $produto);   $produto = str_replace(' ','_', $produto);   $produto = str_replace('/','-', $produto);   produto = str_replace('(','-', $produto);   $produto = str_replace(')','-', $produto);   $produto = str_replace('´','-', $produto);   $pruduto = strtolower($produto);      return $produto;}

Toda função precisa da palavra chave  function, além do nome.  se tiver parâmetro.. tem que colocar entre parênteses... e no final precisa de um return.

 

depois de criada a função basta chamar ela : substitui($produto);

 

Só uma coisa, uma função assim não é muito legal de se deixar.. use a expressão regular .. que você faz em uma linha  rsrs

 

Outra coisa,  é errado concatenar as variáveis para testar se está vazia..  teste desta forma:

$produto = $_POST['pr'];$qtd = $_POST['qtd'];$valor = $_POST['valor'];$obs = $_POST['obs'];if(empty($produto) OR   empty($qtd)     OR   empty($valor)   OR   empty($obs):  //faz alguma coisaelse:  //faz outra coisaendif;  
Link para o comentário
Compartilhar em outros sites

 

Não entendi..  o str_replace()  é usado para substituir strings e não imagens.

Além do mais, o arquivo functions.php não contém função.

Tem que fazer assim:

 

a string seria o caminho da imagem tipo images/images.jpg pra caso tiver images/ímagêmóò.jpg.

 

 

A função nao precisa de um parametro. você declarou $produto como parametro. nao entendi.

 

atualização: e ainda continua o mesmo erro.

<?function produto($produto){$produto = str_replace('ã','a', $produto);$produto = str_replace('â','a', $produto);$produto = str_replace('ä','a', $produto);$produto = str_replace('à','a', $produto);$produto = str_replace('á','a', $produto);$produto = str_replace('õ','o', $produto);$produto = str_replace('ó','o', $produto);$produto = str_replace('ö','o', $produto);$produto = str_replace('ò','o', $produto);$produto = str_replace('ô','o', $produto);$produto = str_replace('ê','e', $produto);$produto = str_replace('é','e', $produto);$produto = str_replace('ë','e', $produto);$produto = str_replace('í','i', $produto);$produto = str_replace('ì','i', $produto);$produto = str_replace('ï','i', $produto);$produto = str_replace('î','i', $produto);$produto = str_replace('ú','u', $produto);$produto = str_replace('ù','u', $produto);$produto = str_replace('ü','u', $produto);$produto = str_replace('û','u', $produto);$produto = str_replace('ç','c', $produto);$produto = str_replace(' ','_', $produto);$produto = str_replace('/','-', $produto);$produto = str_replace('(','-', $produto);$produto = str_replace(')','-', $produto);$produto = str_replace('´','-', $produto);$pruduto = strtolower($produto);return $produto;}?>
<?phpinclude('functions.php');include('conexao.php');$produto = $_POST['pr'];$qtd = $_POST['qtd'];$valor = $_POST['valor'];$obs = $_POST['obs'];$variaveis = $produto.$qtd.$valor;if(!empty($variaveis)){produto($produto);$insert = mysqli_query($conexao, "INSERT INTO tabela_grafica(produto,quantidade,valor,observacoes)VALUES('$produto','$qtd','$valor','$obs')") or die (mysql_error());echo"<script>alert('Cadastrado Com Sucesso.');location.href='index.php';</script>";}else{echo"<script>alert('Preencha os Campos Produto: Quantidade - Valor.');location.href='index.php';</script>";}?>

 

 

Outra coisa,  é errado concatenar as variáveis para testar se está vazia..  teste desta forma:

 

Sim eu estava pensando em fazer isso ja que nao me voltou problemas eu deixei pra la.

Link para o comentário
Compartilhar em outros sites

  • Moderador

@FabianoS

 

Nem sempre a função não precisa de parâmetro.

No seu caso, sim precisa... alias, no php a maioria precisa de um parâmetro. 

Outra coisa que tens que pensar é o seguinte.. 

 

O  lance do caminho das imagens.. no meu ponto de vista não precisa se preocupar com acentuação ou sql injection.

 

Você pode rescrever a função desta maneira:

function checkAcento($string){    $map = array(        'á' => 'a',        'à' => 'a',        'ã' => 'a',        'â' => 'a',        'ä' => 'a',        'é' => 'e',        'è' => 'e',        'ê' => 'e',        'í' => 'i',        'ó' => 'o',        'ò' => 'o',        'ô' => 'o',        'õ' => 'o',        'ú' => 'u',        'ü' => 'u',        'ç' => 'c',        'Á' => 'A',        'À' => 'A',        'Ã' => 'A',        'Â' => 'A',        'Ä' => 'A',        'É' => 'E',        'È' => 'E',        'Ê' => 'E',        'Í' => 'I',        'Ó' => 'O',        'Ò' => 'O',        'Ô' => 'O',        'Õ' => 'O',        'Ö' => 'O',        'Ú' => 'U',        'Ü' => 'U',        'Ç' => 'C');        return strtr($string, $map); // funciona corretamente}

onde ele usa um array associativo... para mapear os caracteres e substituir utilizando a função strtr()

Assim, você só troca os acentos e preserva a "barra"... no caso do seu código.. em  uma das linhas ele subistitui a barra por underline... isso vai prejudicar o caminho da imagem.

então por exemplo no pega o caminho da imagem:

$imagem = "images/ímagêmóò.jpg"//aplica a funçãoecho $imagem_sem_acento = checkAcento($imagem);//retorna images/imagemoo.jpg

Outra coisa que é muito usada.. é criptografar o nome.. com md5 combinando a hora e data... assim você gera uma string única, O facebook por exemplo usa desta forma... quando clica para salvar uma imagem.. o nome da imagem é bem grande cheio de hash 

Link para o comentário
Compartilhar em outros sites

 

 

preserva a "barra"... no caso do seu código.. em  uma das linhas ele subistitui a barra por underline... isso vai prejudicar o caminho da imagem.

nao vou usar esse str_replace para substituir a "/" até porque sim ia prejudicar, só vou usar mais pra nome do produto e observações.

 

 

 

Outra coisa que é muito usada.. é criptografar o nome.. com md5 combinando a hora e data... assim você gera uma string única, O facebook por exemplo usa desta forma... quando clica para salvar uma imagem.. o nome da imagem é bem grande cheio de hash 

 

Nossa gostei bastante desse md5 , ajuda muito. valeu pela informação;

 

 

a respeito da str_replace . nao tem como eu usar aquele código ? Nao sabe porque esta dando erro. 

 

 

o " =>  " do array é o que ? e essa linha

 

return strtr($string, $map); // funciona corretamente

 

vai retorna o str ? mais e esse tr ai na frente . porque o $string , e $map ?

Link para o comentário
Compartilhar em outros sites

  • Moderador

@FabianoS

 

Bem, achei que já estavas um pouco mais familiarizado com o php e funções.

Vamos as explicações.

 

Vou começar pelo array,

 

Para termos um array(vetor), usamos a função array().   ela pode ser vazia... ou pode conter elementos.

estrutura:

//Vetor vazio$vetor = array();//vetor com elementos$frutas = array("Laranja","Maçã","Limão","Morango");

A linha 2, Podemos ver ali que a variável chamada $vetor recebe a função array().  Contudo, a função está vazia.. ou seja, o array não possui nenhum elemento.

 

Agora veja a linha 6. A variável $frutas, recebe a função array(). Dentro dela, foi adicionado elementos entre aspas  separado por virgula. Aspas indicam que é uma string. Se retirar, poderemos utilizar números, então aí o array passa a ser do tipo INT.  A elegância do php.. está que o array pode ser de vários tipos diferentes... então em um mesmo array, podes ter números, strings, funções, um outro array. que nesse caso passaria a ser um array bidimensional(não entraremos em detalhes nisso).

 

Bom temos um array ali.. como posso ver em tela de forma clara a estrutura? Usando a função print_r() entre a tag <pre> </pre>.

 

então experimente fazer isto:

echo"<pre>";echo print_r($frutas);echo "</pre>; 

O retorno será isto:

Array(    [0] => Laranja    [1] => Maçã    [2] => Limão    [3] => Morango) 

Veja que o zero, é o primeiro índice e o elemento é Laranja.

o número 1 é o elemento Maçã..

O sinal  => no array serve para associar o índice ao elemento.

 

Sabendo isso, podemos associar um elemento a outro no vetor.. por exemplo:

$frutas = array("Laranja"=>"Orange","Maçã"=>"Apple","Limão"=>"Lemon","Morango"=>"Strawberry");

Veja que para cada elemento anterior, foi associado o nome dele em inglês.

Usei o simbolo => para dizer que o elemento "Laranja", que agora passa a ser o índice, tem como valor a palavra Orange.

Re-capitulando,  quando o array estava com um elemento sem associações, o índice do elemento era números.. começando pelo zero. Então o índice zero tinha como valor Laranja.

Agora, quando resolveu associar o elemento Laranja a outro, o  Laranja passa a ser o índice e o Orange passa a ser o valor.

 

Se der um print_r no $frutas terá isto:

Array(    [Laranja] => Orange    [Maçã] => Apple    [Limão] => Lemon    [Morango] => Strawberry)

Então voltando para sua dúvida , a função recebe como parâmetro uma string. dentro da função foi atribuída em uma variável, um array de strings.

um sendo o índice e outro o valor.

 

veja:   'á' => 'a'

A letra " á " associada a letra " a "..  e por aí vai.

 

Para que a função funcione, precisamos retornar a função strtr() para substituir os caracteres contidos no array e contidos na string.

Então strtr($string, $map);

 

Veja que o primeiro parâmetro é a string que será alterada  e o segundo parâmetro é a variável que recebe o array de elementos.

 

Resumindo o funcionamento da função de checkAcento()  

Ele recebe a string a ser convertida.

a função strtr() compara a variável da string com o array..  se ele achar algum caractere com acento da string, que está no array como índice, ele vai substituir pelo valor.

 

 

 

vai retorna o str ? mais e esse tr ai na frente . porque o $string , e $map ?

Sim, mas vai retornar o strtr() que é uma função.

Poderíamos atribuir a função em uma variável e retornar esta variável.. por exemplo:

$nova_string = strtr($string, $map);return $nova_string; 

O por que $string e por que $map?   .. são só nome de variáveis... eu poderia ter posto como $caminho_imagem no lugar de $string  e $lista_de_acentos

 

Agora vou explicar um pouco sobre funções

As funções tem a seguinte estrutura:

function hello(){}

Se tentarmos executar ela.. com:

 

echo hello()  nada acontece.. pois está vazia.. e não tem retorno nenhum.

 

Vamos fazer ela funcionar assim:

function hello(){   echo "Hello World!";}

Agora se dermos um echo hello(), vai mostrar em tela "Hello World!".

Podemos poder para uma função usar um valor que a gente quer. Para isso o parâmetro é usado. os Parâmetros ficam dentro do parenteses.

assim:

function hello($nome){   echo "Oi eu sou o $nome";}

e dar um echo hello("fulano de tal") 

vai mostrar em tela:  " Oi eu sou o fulano de tal "

Como pode ver, os parâmetros são os meios de interagir com a função.

 

No seu caso, a função que verifica os acentos precisa ter um parâmetro pelo menos. Que é a própria string do nome da imagem.

Lembre-se que podes chamar a função quantas vezes quiser.. basta colocar a função dentro do laço de foreach que é a função do php destinada a iterar, ou seja, percorrer um elemento array.

 

Desculpe se o post ficou massivo demais para ler. Mas tinha que explicar desta forma. bem esmiuçada. 

Link para o comentário
Compartilhar em outros sites

Muito Bom, entendi tudo, são poucos que fazem o que você faz.  ;)

 

 

só uma coisa

 

 

Lembre-se que podes chamar a função quantas vezes quiser.. basta colocar a função dentro do laço de foreach que é a função do php destinada a iterar, ou seja, percorrer um elemento array.

ou seja eu nao preciso chamar o foreach pra exibir essa função em um if né ?

if(!empty($variaveis)){produto($produto);$insert = mysqli_query($conexao, "INSERT INTO tabela_grafica(produto,quantidade,valor,observacoes)VALUES('$produto','$qtd','$valor','$obs')") or die (mysql_error());echo"<script>alert('Cadastrado Com Sucesso.');location.href='index.php';</script>";}else{echo"<script>alert('Preencha os Campos Produto: Quantidade - Valor.');location.href='index.php';</script>";}

No

 

 

  1. function hello($nome){
  2. echo "Oi eu sou o $nome";
  3. }

eu eu tiver uma variavel fora da função e chamar ela dentro da função sem definir ela como paremetro e errado certo ?

 

 

  1. function hello($nome){
  2. echo "Oi eu sou o $sobrenome";
  3. }


Link para o comentário
Compartilhar em outros sites

  • Moderador

@FabianoS

 

 

 

ou seja eu nao preciso chamar o foreach pra exibir essa função em um if né ?

Depende. Se você está enviando um array de dados sim precisa.

O exemplo disso é o upload  multiplo de imagens.  quando envia mais de uma.. se torna um array de dados.. então precisa de um foreach para iterar.

 

Já no caso de um cadastro de produtos que só tem uma informação de cada campo.. como nome do produto, descrição  e etc.. aí não precisa de foreach por que não é um array.

 

 

 

eu eu tiver uma variavel fora da função e chamar ela dentro da função sem definir ela como paremetro e errado certo ?

Sim. é errado. Ou declara a variável no escopo da função, ou torna a variável global. 

Mas o método de tornar a variável global nesse caso não é para ser usada..

Agora se estivesse usando o paradigma de orientação a objetos.. sim poderia.. pois com uma variável global ... poderia ser acessada de qualquer função.

 

 

Sobre o código acima, chamou a função mas não  foi usada.

Não basta só colocar o nome da função ali .. tem de usar ela. 

 

exemplo:

if(!empty($variaveis)):  $produtos_verificados = produto($produto);  $insert = mysqli_query($conexao, "INSERT INTO tabela_grafica(produto,quantidade,valor,observacoes)VALUES('$produtos_verificados','$qtd','$valor','$obs')") or die (mysqli_error());  echo"<script>alert('Cadastrado Com Sucesso.');location.href='index.php';</script>";else:   echo"<script>alert('Preencha os Campos Produto: Quantidade - Valor.');location.href='index.php';</script>";endif;

Veja que atribui uma variável para a função... e inseri a variável no primeiro parâmetro de values()

Outra coisa que me chama a atenção é esse !empty($variaveis) ...   esse $variaveis é todos as variaveis concatenadas certo?  isso não funciona. precisas testar uma a uma... ou fazer uma função que testa elas e chamar no if.. tu pode fazer isso se quiser e eu acho ate melhor

Uma função pode receber um array vazio como parâmetro.. e posterior preencher esse array para testas. :P

mas acho q isso é um pouco mais avançado pra ti.. então faz do jeito mais fácil primeiro :D

Link para o comentário
Compartilhar em outros sites

Entendi valeu.

 

 

a respeito das variáveis sim eu vou arrumar depois , vou usar o if e atribuir o empty pra cada variavel . ja que só estou testando nao vejo importância agora. 

 

o array que faz a substituição funcionou certinho valeu.

 

Ultima pergunta que nao tem nada vê . uma vez me disse para nao usar a função mail() porque ja estava ultrapassada , queria saber qual e mais indicada agora ?

Link para o comentário
Compartilhar em outros sites

  • Moderador

@FabianoS

 

Não que a função mail() esteja ultrapassada... ela é ruim mesmo.  rsrsrs

O que mais se usa é a classe phpmailer.

 

Como é uma classe, precisas entender o básico do básico de orientação a objetos.. que seria instanciar uma variável de objeto da classe, usar esta variável para chamar as funções da classe.. e etc

Mas isso é um assunto para outro tópico.. quando for conveniente.

Link para o comentário
Compartilhar em outros sites

@FabianoS

 

Não que a função mail() esteja ultrapassada... ela é ruim mesmo.  rsrsrs

O que mais se usa é a classe phpmailer.

 

Como é uma classe, precisas entender o básico do básico de orientação a objetos.. que seria instanciar uma variável de objeto da classe, usar esta variável para chamar as funções da classe.. e etc

Mas isso é um assunto para outro tópico.. quando for conveniente.

 

valeu. Quando for usar retorno. :D

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!