prepare("SELECT id, username, password, salt FROM administradores WHERE email = ? LIMIT 1")) { $stmt->bind_param('s', $email); // Relaciona "$email" ao parâmetro. $stmt->execute(); // Executa a tarefa estabelecida. $stmt->store_result(); // obtém variáveis a partir dos resultados. $stmt->bind_result($user_id, $username, $db_password, $salt); $stmt->fetch(); // faz o hash da senha com um salt excusivo. $password = hash('sha512', $password . $salt); if ($stmt->num_rows == 1) { // Caso o usuário exista, conferimos se a conta está bloqueada // devido ao limite de tentativas de login ter sido ultrapassado if (checkbrute($user_id, $mysqli) == true) { // A conta está bloqueada // retorna false (falso); return 'Conta Bloqueada'; } else { // Verifica se a senha confere com o que consta no banco de dados // a senha do usuário é enviada. if ($db_password == $password) { // A senha está correta! // Obtém o string usuário-agente do usuário. $user_browser = $_SERVER['HTTP_USER_AGENT']; // proteção XSS conforme imprimimos este valor $user_id = preg_replace("/[^0-9]+/", "", $user_id); $_SESSION['user_id'] = $user_id; // proteção XSS conforme imprimimos este valor $username = preg_replace("/[^a-zA-Z0-9_\-]+/","",$username); $_SESSION['username'] = $username; $_SESSION['login_string'] = hash('sha512',$password.$user_browser); // Login concluído com sucesso. return 'Sucesso'; } else { // A senha não está correta // Registramos essa tentativa no banco de dados $now = time(); $mysqli->query("INSERT INTO tentativas_login(user_id, `time`) VALUES ('$user_id', '$now')"); return 'Senha Incorreta'; } } } else { // Tal usuário não existe. return 'Usuário Não Existe'; } } } /* Função para checar ataques de força bruta */ function checkbrute($user_id, $mysqli) { // Registra a hora atual $now = time(); // Todas as tentativas de login são contadas dentro do intervalo das últimas 2 horas. $valid_attempts = $now - (2 * 60 * 60); if ($stmt = $mysqli->prepare("SELECT time FROM tentativas_login WHERE user_id = ? AND `time` > '$valid_attempts'")) { $stmt->bind_param('i', $user_id); // Executa a tarefa pré-estabelecida. $stmt->execute(); $stmt->store_result(); // Se houve mais do que 5 tentativas fracassadas de login if ($stmt->num_rows > 5) { return true; } else { return false; } } } /* Função para checar se o usuário está logado ou não */ function login_check($mysqli) { // Verifica se todas as variáveis das sessões foram definidas if (isset($_SESSION['user_id'],$_SESSION['username'],$_SESSION['login_string'])) { $user_id = $_SESSION['user_id']; $login_string = $_SESSION['login_string']; $username = $_SESSION['username']; // Pega a string do usuário. $user_browser = $_SERVER['HTTP_USER_AGENT']; if ($stmt = $mysqli->prepare("SELECT password FROM administradores WHERE id = ? LIMIT 1")) { // Atribui "$user_id" ao parâmetro. $stmt->bind_param('i', $user_id); $stmt->execute(); // Execute the prepared query. $stmt->store_result(); if ($stmt->num_rows == 1) { // Caso o usuário exista, pega variáveis a partir do resultado. $stmt->bind_result($password); $stmt->fetch(); $login_check = hash('sha512', $password . $user_browser); if ($login_check == $login_string) { // Logado!!! return true; } else { // Não foi logado return false; } } else { // Não foi logado return false; } } else { // Não foi logado return false; } } else { // Não foi logado return false; } } /* Função para limpar o resultado da variável PHP_SELF */ function esc_url($url) { if ('' == $url) { return $url; } $url = preg_replace('|[^a-z0-9-~+_.?#=!&;,/:%@$\|*\'()\\x80-\\xff]|i', '', $url); $strip = array('%0d', '%0a', '%0D', '%0A'); $url = (string) $url; $count = 1; while ($count) { $url = str_replace($strip, '', $url, $count); } $url = str_replace(';//', '://', $url); $url = htmlentities($url); $url = str_replace('&', '&', $url); $url = str_replace("'", ''', $url); if ($url[0] !== '/') { // Estamos interessados somente em links relacionados provenientes de $_SERVER['PHP_SELF'] return ''; } else { return $url; } } ?>