Essa semana vou falar um pouquinho sobre cada técnica de segurança que falei no “Criando Sistemas Seguros – Parte 1” e hoje é a vez do “Banindo IPs por um bem maior“… Vamos lá:
Banir um visitante de vez, baseando-se no IP dele é, sem dúvida, uma das formas mais simples e eficazes (a curto prazo) de evitar que alguém fique brincando com o seu sistema… Claro que o visitante pode mudar o seu IP sem muito esforço, mas em 99% dos casos isso exigiria pelo menos 1 ou 2 minutos dele… E dependendo da rede e dos conhecimentos dele isso pode não ser possível…
Para salvar a lista de IPs banidos usaremos uma tabela no MySQL que pode ser criada com o seguinte código:
CREATE TABLE `banidos` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY , `ip` VARCHAR( 15 ) NOT NULL , `inicio` DATETIME NOT NULL , `fim` DATETIME NOT NULL , INDEX ( `ip` ) ) ENGINE = MYISAM
Já a parte em PHP do sistema vai funcionar da seguinte maneira… Quando o visitante tentar acessar o seu site é incluído um arquivo que busca no MySQL se esse IP está na lista de banidos, caso esteja o visitante é redirecionado para outro site/endereço.
Não vou falar como fazer uma conexão ao MySQL porque isso já foi dito N vezes aqui no blog e ocupa um espaço desnecessário na aula. ![]()
Antes de verificar se um visitante está “banido” precisamos limpar da tabela os registros que já expiraram… Esse passo é opcional pois quando formos verificar se um usuário está banido vamos verificar também se o período é valido… Vamos lá:
<?php
// Inclui o arquivo que faz a conexão com o banco de dados
require_once('mysql.php');
// IP do visitante para uso futuro
$ip_visitante = $_SERVER['REMOTE_ADDR'];
// Deleta os registros que já expiraram, esse passo é opcional!
$sql = "DELETE FROM `banidos` WHERE ( `fim` <= NOW() )";
mysql_query($sql);
?>Agora nós vamos verificar se o IP do visitante consta na lista dos que ainda estão banidos:
<?php
// Inclui o arquivo que faz a conexão com o banco de dados
require_once('mysql.php');
// IP do visitante para uso futuro
$ip_visitante = $_SERVER['REMOTE_ADDR'];
// Deleta os registros que já expiraram, esse passo é opcional!
$sql = "DELETE FROM `banidos` WHERE ( `fim` <= NOW() )";
mysql_query($sql);
// Verifica se o visitante está banido
$sql = "SELECT * FROM `banidos` WHERE ( `ip` = '". $ip_visitante ."' ) AND ( NOW() BETWEEN `inicio` AND `fim` )";
$query = mysql_query($sql);
if (mysql_num_rows($query) > 0) {
// Pelo menos um resultado foi encontrado, o usuário está banido
}
?>Agora é só redirecionar o visitante para outra página/endereço:
// Verifica se o visitante está banido
$sql = "SELECT * FROM `banidos` WHERE ( `ip` = '". $ip_visitante ."' ) AND ( NOW() BETWEEN `inicio` AND `fim` )";
$query = mysql_query($sql);
if (mysql_num_rows($query) > 0) {
// Redireciona o visitante
header("Location: http://www.pudim.com.br/");
exit;
}–
Agora nós vamos criar uma funçãozinha que você vai usar para banir o visitante durante X minutos… Vamos lá:
function banirVisitante($minutos, $ip = null) {
// Define o IP que será banido
$ip = (is_null($ip)) ? $_SERVER['REMOTE_ADDR'] : $ip;
// Verifica se o usuário já está banido
$sql = "SELECT * FROM `banidos` WHERE ( `ip` = '". $ip ."' ) AND ( NOW() BETWEEN `inicio` AND `fim` )";
$query = mysql_query($sql);
if (mysql_num_rows($query) > 0) {
// Cria uma consulta que atualizará o registro do visitante
$sql = "UPDATE `banidos` SET `fim` = DATE_ADD(NOW(), INTERVAL ".$minutos." MINUTE) WHERE ( `ip` = '". $ip ."' ) AND ( NOW() BETWEEN `inicio` AND `fim` )";
} else {
// Cria uma consulta que insere o registro na tabela
$sql = "INSERT INTO `banidos` VALUES ( NULL, '". $ip ."', NOW(), DATE_ADD(NOW(), INTERVAL ".$minutos." MINUTE) )";
}
// Executa a consulta criada dentro do IF/ELSE
mysql_query($sql);
// Redireciona o visitante
if ($_SERVER['REMOTE_ADDR'] == $ip) {
header("Location: http://www.pudim.com.br/");
exit;
}
}Aí quando você quiser banir um visitante, seja qual for o motivo, é só usar a função criada:
// Banir visitante por 10 minutos banirVisitante(10); // Banir um IP específico por 3 dias banirVisitante(60 * 24 * 3, '114.154.95.24');
–
Espero que tenham gostado! ![]()
Você também vai gostar de ler:
- Contador de visitantes online em PHP e MySQL
- Como criar um Sistema de Login com Níveis de Permissão
- Contador de visitas usando o MySQL
- Sistema de busca em PHP e MySQL com paginação
- Manipulando dados do MySQL com o PHP
Postado em Artigos, MySQL, PHP, Tutoriais
Com as tags Banco de Dados, Busca, Código, Conexão, Header, INSERT, MySQL, PHP, Proteção, Scripts, Segurança, Sistema, Sistemas, SQL, Tutoriais
Escrito por Thiago Belem
Gostou desse artigo?
Não se esqueça de assinar o RSS e divulgue-o para o mundo:

Háe galera! sou novo nesse mundo de PHP E MySQl apenas sei um pouco de HTML. Então estou voando com esse assunto
mas, é bem legal e gostaria de saber como faço? Eu pego todo esses códigos e salvo como PHP, e coloco ele na pasta do meu index para funcionar. Como é gente? Explica aí por favor… falow
Seu site é ótimo. Parabéns pela didática.
E se o visitante estiver vindo de um Proxy?
@Antonio
Aí ele terá o IP do proxy e conseguirá acessar o seu sistema.
ola Thiago,
obrigado pela sua ajuda!
mas o que eu nao entendi é como fazer a contagem das 5 tentativas, entendeu?
mais uma vez obrigado!
@Rafael
Faça a contagem usando cookies para salvar a quantidade de falhas… Não esqueça de limpar o cookie quando o usuário conseguir se logar ou for banido.
Thiago,
muito bom seu site!!
Se vc puder me ajudar, como consigo bloquear um user/ip após o mesmo ter digitado a senha 3 ou 5 vezes errada?
obrigado
@Rafael
É só você usar a função com foi explicado no artigo.
Oláa
qual é o formato do periodo de expiração?
dd/mm/aaaa
?
@Nando
O campo DATETIME do MySQL segue o formato AAAA-MM-DD HH:MM:SS
Cara show esse tuto parabéns …..
Realmente muito bom.
Quem quer ter menos trabalho, pode utilizar o .htaccess também.
muito bom o tutorial, me ajudou bastante
Show de bola thiago.
Esses dias fiz um para um sistema, e realmente é muito util.
Valeu.