Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Estou tentando desenvolver um sistema de login que seja seguro, aparentemente, acho que estou tendo sucesso, mas não sei como confirmar isso, então vim pedir ajuda de vocês, alguém poderia avaliar o código a baixo e me dizer se existe alguma espécie de segurança boa nele?
Desde ja obrigado.
Esse é a classe que trata os dados(não tratados com js) via método POST para o loginView renderizar as respostas.
<?php
class loginModel {
//Verifica se o login foi efetuado, deve ser chamado em todas as paginas
public function verif_if_is_logged() {
//Nomeia a sessão
session_name('system_access');
//Inicia a sessão
session_start();
//Verifica se o ID do usuário ja foi definido
if (!isset($_SESSION['userID'])) {
//se não foi, destroi a sessão
session_destroy();
return 0;
} else {
//Se foi devolve true para o view
return 1;
}
}
// Função para verificar o login
public function verif_if_is_valid_login() {
//Função para filtrar os POSTS
$_POST = Sanitize::filter($_POST);
//pega os inputs com nomes encripitados
$login_hash = sha1('user_login');
$password_hash = sha1('user_password');
//Pega os POSTS
$user_login = $_POST[$login_hash];
$user_pass = sha1($_POST[$password_hash]);
//Query para verificar se o user existe
$sql = "SELECT COUNT(*) FROM internal_users WHERE login = '$user_login' AND password = '$user_pass'";
//Resposta da verificação de login
$user_status = MySQLComponents::get_count_reg_mysql_PDO($sql);
//Verifica se o usuário ja está logado
$logged_status = self::verifi_if_user_is_logged($user_login, $user_pass);
// se false, usuário ja está logado, recusar
if ($logged_status['status'] == 0) {
//resposta recusada
$response['login_attempts']['status'] = 0;
//mensagem da resposta
$response['login_attempts']['msg'] = $logged_status['msg'];
} else {
//Se o usuário não está logado define o login como ativo
$response = self::set_login_as_active($user_status, $user_login, $user_pass);
}
//Retorna para o ajax
return $response;
}
//Função para verificar se o usuário ja está logado
private function verifi_if_user_is_logged($user_login, $user_pass) {
//Query quer verifica se o usuário está logado
$sql = "SELECT COUNT(*) FROM internal_users WHERE login = '$user_login' AND password = '$user_pass' AND login_status = '1'";
//REsposta da execução da query
$login_status = MySQLComponents::get_count_reg_mysql_PDO($sql);
//Se maior que 0, ja está logado
if ($login_status > 0) {
//Resposta de recusa
$response['status'] = 0;
//Mensagem de resposta
$response['msg'] = 'O pedido de acesso foi negado pois este usuário ja encontra-se logado, foi enviado um notificação ao e-mail relacionado.';
} else {
//Resposta de aceito
$response['status'] = 1;
}
//resposta para a função
return $response;
}
//Função para definir o login como ativo
private function set_login_as_active($login_status, $user_login, $user_pass) {
//Se o login teve sucesso
if ($login_status == 1) {
//Inicia sessão nomeada
session_name('system_access');
session_start();
//Query para buscar os dados do usuário
$sql = "SELECT id,cod,level,relationship FROM internal_users WHERE login = '$user_login' AND password = '$user_pass'";
//Resposta com os dados do usuário
$rs = MySQLComponents::get_rs_array_stmt_PDO($sql);
//Define os dados de usuário para a sessão
$session_data = self::set_session_variables($rs);
//Recura o COD do usuário
$cod = $session_data['userCod'];
//Verifica se a seessão foi iniciada e login foi feito
$login_status = self::verif_if_is_logged();
//Se o login foi feiro
if ($login_status == 1) {
//query para definir com logged true
$sql_2 = "UPDATE internal_users SET login_status = '1' WHERE cod = '$cod'";
//Resposta de query
$rs_2 = MySQLComponents::get_exec_query_stmt_PDO($sql_2);
//Se o usuário foi setado como logado
if ($rs_2 == 1) {
//Salvar na tabela histório a ação de sucesso no login
historicMaker::set_data_on_history($cod, 'login_success', $cod);
}else{
//Se não foi setado como ativo, salvar histórico de erro
historicMaker::set_data_on_history($cod, 'login_failed', $cod);
}
}
//Resposta da siituação
$response['status'] = $login_status;
} else {
//Gera um código para a tentativa de login
$cod = uniqid(rand(), true);
//Chama a função componente que pega o IP do usuário
$IP = Components::get_client_IP();
//Query para inserir tentativa de login
$sql = "INSERT INTO internal_login_attempts (cod,user_relacionated,ip) VALUES ('$cod','$user_login','$IP')";
//Resposta da query
$rs = MySQLComponents::get_exec_query_stmt_PDO($sql);
//Função que monta array com retorno das tentativas de login
$response['login_attempts'] = self::verif_login_attempts($user_login);
//Respara para false
$response['status'] = 0;
}
//retorno da função
return $response;
}
//Função para controlar as tentativas de login
private function verif_login_attempts($user_login) {
//Pega data de hoje
$today = date('Y-m-d H:i:s');
//Converte em timestamp
$timestamp = strtotime($today);
//Diminui 1 dia do timestamp
$timestamp2 = strtotime('-1 day', $timestamp);
//Converte o timestamp em formato datetime
$minus_24h = date('Y-m-d H:i:s', $timestamp2);
//Captura o IP do usuáio
$IP = Components::get_client_IP();
//Query para verificar a qeuantidade de tentativas nas ultimas 24 horas
$sql = "SELECT datetime FROM internal_login_attempts WHERE IP = '$IP' AND (datetime < '$today' AND datetime > '$minus_24h')";
//Resposta da query
$rs = MySQLComponents::get_rs_array_stmt_PDO($sql);
//Contagem de tentativas
$count = (int) count($rs);
if ($count == 0) {
$response['msg'] = "3 tentativas restantes";
} elseif ($count == 1) {
$response['msg'] = "2 tentativas restantes";
} elseif ($count == 2) {
$response['msg'] = "1 tentativa restantes";
$response['remember_pass']['status'] = 1;
$response['remember_pass']['msg'] = "O acesso para esta máquina será bloqueado por 24 horas no próximo erro, o desbloqueio só será possível em contato com o provedor do serviço, deseja tentar novamente?";
} elseif (($count > 2)) {
$response['msg'] = "Máquina bloqueada, contate o provedor do serviço.";
}
return $response;
} private function set_session_variables($rs) {
//
$count = count($rs);
if ($count == 1) {
foreach ($rs as $row) {
$_SESSION['userID'] = $row['id'];
$relationship = $row['relationship'];
//Query para buscar o colaborador ou o cliente que está relocionado ao usuário ativo
$sql = "(SELECT personal_name FROM data_collaborators WHERE cod = '$relationship')
UNION
(SELECT company_name FROM data_companies WHERE cod = '$relationship')
";
//Função compenente para executar a query
$rs = MySQLComponents::get_rs_array_stmt_PDO($sql);
//definindo as váriaveis
$_SESSION['userName'] = $rs[0]['personal_name'] . $rs[0]['company_name'];
$_SESSION['userLevel'] = $row['level'];
$_SESSION['userCod'] = $row['cod'];
}
}
return $_SESSION;
}
public function set_login_as_inactive() {
//a fazer
}
}Carregando comentários...