Tendo dificuldade em entender essa função.
function checkbrute($user_id, $mysqli) {
// Retorna a data atual
$now = time();
// Todas as tentativas de login são contadas pelas 2 últimas horas.
$valid_attempts = $now - (2 * 60 * 60);
if ($stmt = $mysqli->prepare("SELECT time FROM login_attempts WHERE user_id = ? AND time > '$valid_attempts'")) {
$stmt->bind_param('i', $user_id);
// Executa a query preparada.
$stmt->execute();
$stmt->store_result();
// Se houver mais de 5 tentativas falhas de login
if($stmt->num_rows > 5) {
return true;
} else {
return false;
}
}
}
// utilizar declarações preparadas significa que a injeção de código SQL não será possível.
if ($sql_anexa = mysql_query("SELECT * FROM servidor WHERE email LIKE '%$dados%' OR senha LIKE '%$dados%'")or die(mysql_error()))// O DIE SERVE PARA RETORNAR MENSAGEM DE ERRO.
{
$stmt->bind_param('s', $email); // Vincula "$email" ao parâmetro.
$stmt->execute(); // Executa a query preparada.
$stmt->store_result();
$stmt->bind_result($user_id, $username, $db_password, $salt); // obtém variáveis do resultado.
$stmt->fetch();
$password = hash('sha512', $password.$salt); // confere o hash de "$password" e "$salt"
if($stmt->num_rows == 1) { // se o usuário existe
// Nós checamos se a conta está bloqueada devido a várias tentativas de login
if(checkbrute($user_id, $mysqli) == true) {
// Conta está bloqueada
// Envia um email ao usuário comunicando que sua conta foi bloqueada
return false;
} else {
if($db_password == $password) { // Checa se a senha na base de dados confere com a senha que o usuário digitou.
// Senha está correta!
$ip_address = $_SERVER['REMOTE_ADDR']; // Pega o endereço IP do usuário.
$user_browser = $_SERVER['HTTP_USER_AGENT']; // Pega a string de agente do usuário.
$user_id = preg_replace("/[^0-9]+/", "", $user_id); // Proteção XSS conforme poderíamos imprimir este valor
$_SESSION['user_id'] = $user_id;
$username = preg_replace("/[^a-zA-Z0-9_\-]+/", "", $username); // Proteção XSS conforme poderíamos imprimir este valor
$_SESSION['username'] = $username;
$_SESSION['login_string'] = hash('sha512', $password.$ip_address.$user_browser);
// Login com sucesso.
return true;
} else {
// Senha não está correta
// Nós armazenamos esta tentativa na base de dados
$now = time();
$mysqli->query("INSERT INTO login_attempts (user_id, time) VALUES ('$user_id', '$now')");
return false;
}
}
} else {
// Nenhum usuário existe.
return false;
}
}
Minha dificulda e a seguinte:
Não estou entendendo, o time e o from login_attemps, se minha tabela de login e única e servidor.
if ($stmt = $mysqli->prepare("SELECT time FROM login_attempts WHERE user_id = ? AND time > '$valid_attempts'"))
Geente na minha página de login, ele já conecta ao meu banco, quando o usuario digita o email e senha correta ele leva a pessoa a index caso contrario volta na página de login de novo.
essa "pequena" função ai, ataques de brute force ou força bruta acontecem quando hackers tentam milhares de diferentes senhas em uma conta, seja de forma randômica através de senhas aleatórias ou através de um dicionário de palavras. Em nosso script, se um usuário falhar em sua tentativa de login por mais de 5 vezes, sua conta será bloqueada.
maior segurança no meu site
Para deixa mais claro minha duvida, e que não sei o que faze na parte "select", se devo cria nova tabelas no meu banco e coloca no "select" ou se devo coloca tudo servidor onde esta os dados do meu banco.
Discussão (3)
Carregando comentários...