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:
