Ir ao conteúdo
  • Cadastre-se

PHP Como evitar Session hijacking no login com PHP?


Posts recomendados

<?php
//Abrindo Sessão
session_start();

//Incluindo Conexão
include_once("conexao.php");

//Consulta o Bando de Dados e captura o Usuário na Tabela
$result = "SELECT * FROM usuario LIMIT 1";
$resultado = mysqli_query($conn, $result);
$ver = mysqli_fetch_assoc($resultado);

$_SESSION['id'] = $ver['id'];
$_SESSION['id'] = md5(microtime(true));

echo $_SESSION['id'];

Estou usando o md5 para ficar mudando aleatoriamente o número da ID do usuário logado que recebo da tabela do MySQL (a id é gerada automaticamente em meu bd).

 

Pesquisando sobre segurança de login, achei isso que é relevante da documentação do PHP: https://www.php.net/manual/pt_BR/function.session-regenerate-id.php

 

Porém, como implementar o Session Regenerate Id com essa minha ID do BD??

 

Quem souber desde já obrigado e quem leu até aqui obrigado também!

Link para o comentário
Compartilhar em outros sites

@assinante Bom amigo trocar o id da "Session" não vai impedir o sequestro, existe outras maneiras  de melhora a segurança.

 

Cria um token que é atualizado com frequência e um middleware que verifique os cabeçalho da requisição feita pelo usuário, é um bom começo, eu também adicionaria um token ante CSRF.

Link para o comentário
Compartilhar em outros sites

@GabrielSennaMs Esse Token fica salvo no bd? Não vai sobrecarregar o sistema, ficar mandando requisição de update sempre para o banco de dados? Esse middleware não é um software?

 

fazer isso ajuda? é isso que você diz quando fala de token?

 

login.php

 

<?php
//Função para gerar código aleatório.
function generateRandomString($length = 15) {
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $charactersLength = strlen($characters);
    $randomString = '';
    for ($i = 0; $i < $length; $i++)
        $randomString .= $characters[rand(0, $charactersLength - 1)];

    return $randomString;
} 

//Gera um novo token
$_SESSION['Token'] = generateRandomString();

//Gera um nome aleatório para cada campo do formulário
$_SESSION['TokenFieldName'] = generateRandomString();
$_SESSION['LoginFieldName'] = generateRandomString();
$_SESSION['SenhaFieldName'] = generateRandomString();
?>

<form method="POST" action="autenticar.php">
    <input type="hidden" name="<?=$_SESSION['TokenFieldName']?>" value="<?=$_SESSION['Token']?>" />
    <input type="text" name="<?=$_SESSION['LoginFieldName']?>" placeholder="login"><br>
    <input type="password" name="<?=$_SESSION['SenhaFieldName']?>" placeholder="senha"><br>
    <button type="submit">Logar</button>
</form>

autenticar.php

<?php
session_start();

if(isset($_SESSION['Token'], $_SESSION['TokenFieldName'], $_SESSION['LoginFieldName'], $_SESSION['SenhaFieldName'])) {
    if (isset($_POST[$_SESSION['TokenFieldName']], $_POST[$_SESSION['LoginFieldName']], $_POST[$_SESSION['SenhaFieldName']])) { 
        if ($_POST[$_SESSION['TokenFieldName']] === $_SESSION['Token']) {
             /*Valida $_POST['login'] e $_POST['senha']*/
        } else {
             echo 'Requisição invalida';
        }
    } else {
        echo 'Faltam dados no Form';
    }
 }

//Apaga o token e os campos
//Isso é necessário, caso contrário bastava o atacante fazer um inspecionar elemento e ver os respectivos names no formulário e apenas executar um POST Request para o `autenticar.php`.
//O token e os respectivos nomes serão gerados novamente no `login.php`, sendo assim terá sempre que passar pelo formulário.
unset($_SESSION['Token']);
unset($_SESSION['TokenFieldName']);
unset($_SESSION['LoginFieldName']);
unset($_SESSION['SenhaFieldName']);

 

Link para o comentário
Compartilhar em outros sites

@assinante Bom tarde!

 

26 minutos atrás, assinante disse:

Esse middleware não é um software?

Não,vou passar dois links de duas Frameworks conhecidas no mercado que podem te ajudar a entender melhor o que é uma Middleware. 

http://www.slimframework.com/docs/v3/concepts/middleware.html

https://laravel.com/docs/8.x/middleware

 

28 minutos atrás, assinante disse:

Não vai sobrecarregar o sistema, ficar mandando requisição de update sempre para o banco de dados?

Não, você também pode optar pro gerar token que se validão com base em algum dado do usuário ou usar armazenamento em cache pra isso.

 

29 minutos atrás, assinante disse:

Esse Token fica salvo no bd?

Isso vai depender de onde você quer guarda.

 

31 minutos atrás, assinante disse:

fazer isso ajuda? é isso que você diz quando fala de token?

Não.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@GabrielSennaMs Nunca usei o Laravel porém ele foi o que mais chamou atenção. Principalmente, devido essas duas funções dele de proteção:

 https://laravel.com/docs/8.x/csrf  e  https://laravel.com/docs/8.x/middleware .

 

Porém, como usar o Laravel no meu sistema de login? Não existe uma alternativa segura e mais simples? 

Link para o comentário
Compartilhar em outros sites

@assinante

 

4 horas atrás, assinante disse:

Porém, como usar o Laravel no meu sistema de login?

Bom se você for usar o Laravel, você vai ter que altera toda sua estrutura para usar o Framework, não tem como usar só o sistema de login.

 

4 horas atrás, assinante disse:

Não existe uma alternativa segura e mais simples? 

Bom não existe uma alternativa segura e simples, ou ela é simples ou segura, você tem que mediar entre as duas.

 

4 horas atrás, assinante disse:

Nunca usei o Laravel porém ele foi o que mais chamou atenção. Principalmente, devido essas duas funções dele de proteção:

Segurança é um dos motivos que muitos, eu também, utilizam uma Framework, essa parte já está bem definida e estruturada e já foi testada.

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@assinante

 

5 horas atrás, assinante disse:

Você usa qual, geralmente, para isso? O laravel ou outra?

Bom geralmente quando eu tenho um servido de aplicação, eu utilizo Laravel, ele tem mais recursos, e quando eu utilizo um simples servidor web, eu prefiro usar coisa menores, como o Slim, ou ate mesmo algo feito por mim.

Link para o comentário
Compartilhar em outros sites

@assinante 

 

A lógica geralmente é assim:

 

Eu tenho um problema! 

Eu posso resolver ele? 

Posso sim.

Qual é a melhor forma de resolver?

Undefined. 😛

 

Infelizmente não tem uma forma pronta para resolver essa pergunta, agora vai de muito estudo, pratica e experiencia. 

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!