+5

Criando um Sistema de Banimento para o seu Site

criado por João K. em 10/08/2003 4:54pm
Como podemos banir um usuário de suas páginas. A única informação que podemos utilizar até o momento é o endereço IP do próprio usuário e cookies.

Cookie é uma maneira muito boa de marcar um usuário como sendo indesejável em sua página. Mas o ponto fraco deste sistema é que o cookie fica instalado no navegador do usuário e pode ser facilmente eliminado. Basta apagar os cookies nas opções internas do navegador.

Então vamos para a opção de endereço IP. Como podemos banir um IP do seu site? Primeiro é claro, você precisa saber o endereço IP do usuário que você quer banir. Com essa informação podemos começar a trabalhar.

Imaginando que o IP em questão seja 255.255.255.57 facilmente podemos fazer um rotina para verificar se o IP do usuário é igual ao do atual visitante. O problema do IP é que: como a grande maioria dos usuários utiliza IP dinâmico, i.e., o IP muda a cada nova conexão que o usuário faz com a Provedora, a comparação IP por IP de forma exata é inviável. A solução é banir todos os usuários da provedora o que pode trazer mais problemas do que benefícios, mas como não existe solução perfeita então que seja essa mesmo.

Para facilitar a vida do desenvolvedor, a lista dos IPs banidos será armazenado dentro de um arquivo TXT.

lista_de_ip_banidos.txt:
255.255.255.27
274.148.214.178
200.17.4.124

teste.php:
<?php
function criar_mascara_ip($ip)
{
    $ip_array = explode('.', $ip);
    $ip_mask = "$ip_array[0].$ip_array[1].$ip_array[2]";
    return $ip_mask;
}

function check_bannedips($ip)
{
    $banned_array = file('lista_de_ips_banidos.txt'); // carregar lista de ips numa array
    for ($counter=0; $counter < sizeof($banned_array); $counter++) {
        if (criar_mascara_ip($ip) == criar_mascara_ip($banned_array[$counter])) {
            echo 'Seu IP foi banido do site';
            exit;
        }
    }
}

check_bannedips($HTTP_ENV_VARS['REMOTE_ADDR']);
echo 'Monstrando conteúdo para IP OK.';
?>

Para testar no seu computador o script, acrescente à lista o IP 127.0.0.1 que é normalmente o IP padrão do computador pessoal.

A função criar_mascara_ip funciona para que se resolva o problema de IP dinâmicos que existe. Os IPs são fornecidos por BLOCO para cada provedora, sendo assim é fácil banir os usuários de um provedora.

Para entender o que signfica bloco de IPs: Imagine uma provedora fictícia chamda Anerica On Line. Os ips que esta provedora irá fornecer para os usuários quando eles se conectarem a internet será.

200.127.30.1
200.127.30.2
200.127.30.3
200.127.30.4
200.127.30.5
até
200.127.30.255

Sendo assim para banir todos os usuários desta provedora basta criar uma máscara que retira os últimos digitos (resultando em 200.127.30), assim irá bloquear todos os IPs desta provedora.

Truque: Um truque pouquíssimo ortodoxo que utilizo é criar uma página error404.php para encobrir o site. Assim quando o usuário banido visitar sua página ele não irá receber a mensagem de que está banido, mas irá imprimir uma página dizendo que a página não foi encontrada no servidor - as famosas páginas '404 - NOT FOUND' que com certeza você já visualizou na internet.

Com o tempo, o usuário banido que visitar o seu site pensará que ele está fora do ar, deletado do servidor ou outra coisa e não irá voltar. Isso que eu chamo de utilizar de forma não muito ética a psicologia comportamental.

Alterando a função check_bannedips para incluir a página com o erro fictício:

<?php
function check_bannedips($ip)
{
    $banned_array = file('lista_de_ips_banidos.txt');
    for ($counter=0; $counter < sizeof($banned_array); $counter++) {
        if (criar_mascara_ip($ip) == criar_mascara_ip($banned_array[$counter])) {
            include('error404.php'); // Página fictícia para PAGE NOT FOUND
            exit;
        }
    }
}
?>

error404.php:
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<HTML><HEAD>
<TITLE>404 Not Found</TITLE>
</HEAD><BODY>
<H1>Not Found</H1>
The requested URL <?php echo $_SERVER["SCRIPT_NAME"]; ?> was not found on this server.<P>
<HR>
<ADDRESS>Apache/1.3.26 Server at www.meudominio.com.br Port 80</ADDRESS>
</BODY></HTML>

Não esqueça que para melhor veracidade do "erro", digite no seu navegador um endereço que não existe no seu site para ver como é o layout da página HTML de erro.

Comentários:

Mostrando 1 - 9 de 9 comentários
Tiago Matias disse:
Se a internet for distribuida por um router duma empresa esse script funciona na mesma?
26/11/2003 10:55am (~13 anos atrás)

AE parabéns, eu tava precisando..
09/09/2003 10:34am (~13 anos atrás)

Se você realmente precisa banir um usuario de seu site, você esta com grandes problemas, porem na minha opinião o melhor metodo é um cookie simplês qualquer, que quando encontrado faça o usuario receber um erro 404, ou ver o erro ele desiste do site e pronto, num vai imaginar que você colocou um cookie nele, fora isto todas as outras formas na minha opinião são ruins, principalmente bloquear todo um provedor, imagine bloquear o ig, o que será de você???

Faça um site onde um usuario não possa deixar marcas, como não tendo lugar onde ele possa escrever, forum por exemplo! tenha um forum mas faça uma aprovação da publicação antes de colocar ao ar, eu fiz isto em meu site www.infolive.com.br nas matérias qualquer um publica mas eu tenho que aprovar antes.
03/09/2003 8:30pm (~13 anos atrás)

Diogo Gomes disse:
O session servirá para identificar o usuário, se ele deletar o cookie, é só criar uma forma de testar pelo session se o cookie está gravado...
13/08/2003 7:31pm (~13 anos atrás)

João K. disse:
O melhor jeito é criar um sistema de cadastro mesmo, somente após o usuários se registrar que tem acesso ao conteúdo do site. Ai se vc quiser banir o usuário fica muito fácil. Mas esse sistema é um problema já que muitos não gostam de se cadastrar, preencher formulários e mais formulários para ter acesso a um conteúdo. Eu pessoalmente odeio me cadastrar para ler notícias de um site, mas às vezes, é a única solução.

13/08/2003 11:56am (~13 anos atrás)

Deletando o cookie com o browser aberto ira funcionar da sessão atual, jah que quando ele voltar (numa outra conexão) o apache ira criar uma nova session nova, então voltamos ao mesmo problema de impedir ele de prender o usuario pelo ip completo
Ex: 255.255.255.254

grande abraço
13/08/2003 8:26am (~13 anos atrás)

Diogo Gomes disse:
Em diversas empresas a internet é fornecida por um computador central, com um endereço ip válido e distribui o acesso para as outras máquinas, talvez esse não seria um método viável, já que o que interessa muitas vezes é que o usuário visite o site.
Talvez um sistema que utilize cookies e sessions(para o caso do usuário deletar o cookie com o browser aberto), poderia funcionar melhor.
12/08/2003 6:55pm (~13 anos atrás)

João K. disse:
Sim. é possível, mas utilizando uma página específica feito em PHP é possível adicionar maiores funções: exemplo armazenar dados no banco de dados.
11/08/2003 7:53pm (~13 anos atrás)

Olá,
parabéns pelo artigo,
navegando pela internet achei sem querer coo enviar headers 404 verdadeiros é só usar

<? header("HTTP/1.0 404 Not Found"); ?>
com isso é redirecionado para uma página de erro normal, sem a necessidade de simular uma já que varia de sistema para sistema.

Um abraço,
Alessander Thomaz
10/08/2003 10:33pm (~13 anos atrás)

Novo Comentário:

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