Como criar um sistema de gerenciamento de sessão seguro no php e no mysql

Este guia mostrará como você pode armazenar suas sessões firmemente em um banco de dados MySQL. Também iremos criptografar todos os dados da sessão que entrarão no banco de dados, o que significa que se alguém conseguir hackear no banco de dados todos os dados da sessão são criptografados por criptografia AES de 256 bits.

Passos

Método 1 de 3:
Configure o banco de dados MySQL
  1. Imagem intitulada 2238751 1
1. Crie um banco de dados MySQL.
Neste guia, vamos criar um banco de dados chamado "Secure_sessions".
Veja como Criar-A-Database-In-PhpmyAdmin.
Ou você pode usar o código SQL abaixo criará um para você.

Criar código de banco de dados:
Criar banco de dados `Secure_sessions` -
Nota: Alguns serviços de hospedagem não permitem que você crie um banco de dados através de PhpmyAdmin, aprenda como fazê-lo no cPanel.
  • Imagem intitulada 2238751 2
    2. Crie um usuário apenas selecione, insira e exclua privilégios.
    Isso significa que, se houver uma violação de segurança em nosso script, o hacker não pôde abandonar as tabelas do nosso banco de dados.Se você é realmente paranóico, crie um usuário diferente para cada função.

  • Do utilizador: "sec_user"
  • Senha: "EKCGZR59ZAA2BEWU"


  • Criar código de usuário:
    Criar usuário `sec_user` @ `localhost` identificado por `EKCGZR59ZAA2BEWU`-GRANT SELECT, inserir, atualizar, excluir em `secure_sessions`.* Para `sec_user` @ `localhost`-

    Nota: é uma boa ideia alterar a senha no código acima ao executar seu próprio servidor. (Certifique-se de alterar seu código PHP também.) Lembre-se que não precisa ser uma senha que você pode lembrar, portanto, fazer é tão complicado quanto possível. Aqui está A Senha aleatória gerador.
  • Imagem intitulada 2238751 3
    3. Crie uma tabela mysql chamada "Sessões".
    O código abaixo cria uma tabela com 4 campos (ID, set_time, dados, session_key).

    Criar o "Sessões" tabela:
    Criar tabela `sessions` (« ID` Char (128) não nulo, `set_time` char (10) não null,« dados »texto não nulo,` session_key` char (128) não nulo, chave primária ) Motor = InnoDB padrão charset = latin1-
    Nós usamos o tipo de dados do CHAR para os campos que conhecemos a duração, como os campos "eu ia" e "session_key" sempre será de 128 caracteres. Usar o char aqui economiza no poder de processamento.
  • Método 2 de 3:
    Criar sessão.aula.Arquivo PHP
    1. Imagem intitulada 2238751 4
    1. Criar classe.
    Para iniciar uma nova classe, você precisará inserir o código abaixo:

    Nova classe:
    sessão de classe {
  • Imagem intitulada 2238751 5
    2. Criar função __construct.
    Esta função será chamada toda vez que criarmos uma nova instância de um objeto usando a classe `sessão`. Você pode ler na função PHP __construct aqui.
    Esta função define nosso manipulador de sessão personalizado por isso está disponível para uso assim que a classe é instanciada (i.E., feito / construído / construído).

    __construct Function:
    função __construct () {// defina nossas funções de sessão personalizada.session_set_save_handler (array ($ isso, `aberto`), array ($ isso, `fechar`), array ($ isso, `Leia`), Array ($ isso, `Write`), Array ($ isso, `Destroy` ), array ($ isto, `gc`)) - // Esta linha impede efeitos inesperados ao usar objetos como manipuladores de salvamento.register_shutdown_function (`session_write_close`) -}
  • Imagem intitulada 2238751 6
    3. Criar start_session função.
    Esta função será chamada toda vez que você quiser iniciar uma nova sessão, use-a em vez de session_start ()-. Veja os comentários no código para ver o que cada linha faz.

    Função Start_Session:
    Função Start_Session ($ Session_name, $ SECRET) {// Certifique-se de que o cookie da sessão não esteja acessível via jаvascript.$ httponly = verdadeiro - // algoritmo de hash para usar para a sessão. (use hash_algos () para obter uma lista de hashes disponíveis.$ session_hash = `sha512` - // verifique se o hash está disponívelif ($ session_hash, hash_algos ())) {// definir a função tem.ini_set (`sessão.hash_function `, $ session_hash) -} // quantos bits por caráter do hash.// Os valores possíveis são `4` (0-9, a-f), `5` (0-9, A-V) e `6` (0-9, A-Z, A-Z, "-", ",").ini_set (`sessão.hash_bits_per_character `, 5) - // Force a sessão a usar apenas cookies, não variáveis ​​de URL.ini_set (`sessão.use_only_cookies `, 1) - // Obtenha parâmetros de cookie de sessão $ cookieparams = session_get_cookie_params () - // definir os parameterssession_set_cookie_params ($ cookieparams ["tempo de vida"], $ cookieparams ["caminho"], $ cookieparams ["domínio"], $ seguro, $ httponly) - // altere o nome da sessão session_name ($ session_name) - // agora nós gato começamos o sessionsion_start () - // esta linha regenera a sessão e exclui o antigo. // Também gera uma nova chave de criptografia no banco de dados. session_regenerer_id (true) -}
  • Imagem intitulada 2238751 7
    4. Crie função aberta.
    Esta função será chamada pelas sessões PHP quando iniciarmos uma nova sessão, usá-lo para iniciar uma nova conexão de banco de dados.

    Função aberta:
    Função Abrir () {$ host = `localhost` - $ user = `sec_user` - $ PASS = `EKCGZR59ZAA2BEWU` - $ NAME = `Secure_Sessions` - $ MySQLI = NOVO MYSQLI ($ host, $ User, $ Pass ) - $ isso->db = $ mysqli-retorno true-}


  • Imagem intitulada 2238751 8
    5. Crie função próxima.
    Esta função será chamada quando as sessões querem ser fechadas.

    Função Fechar:
    função fechar () {$ isso->db->fechar () - retorno verdadeiro-}
  • Imagem intitulada 2238751 9
    6. Criar função de leitura.
    Esta função será chamada por PHP quando tentarmos acessar uma sessão, por exemplo, quando usamos echo $ _Session [`alguma coisa`]-. Porque pode haver muitas chamadas para essa função em uma única página, aproveitamos as declarações preparadas, não apenas para segurança, mas também para o desempenho. Nós só preparamos a declaração uma vez que podemos executá-lo muitas vezes.
    Também descriptografamos os dados da sessão criptografados no banco de dados. Estamos usando criptografia AES de 256 bits em nossas sessões.

    Função de leitura:
    Função Leia ($ ID) {if (!isset ($ isso->read_stmt)) {$ isso->read_stmt = $ isso->db->preparar("Selecione dados de sessões onde id = ? Limite 1") -} $ isso->read_stmt->Bind_Param (`S`, $ ID) - $ isto->read_stmt->Execute () - $ isso->read_stmt->Store_Result () - $ isto->read_stmt->bind_result ($ data) - $ isso->read_stmt->buscar () - $ tecla = $ isso->GETKEY ($ ID) - $ data = $ isso->Descriptografar ($ Data, $ Key) -Return $ Data-}
  • Imagem intitulada 2238751 10
    7. Criar função de gravação.
    Esta função é usada quando atribuímos um valor a uma sessão, por exemplo $ _Session [`alguma coisa`] = `outra coisa`-. A função criptografa todos os dados que são inseridos no banco de dados.

    Função de gravação:
    Função Write ($ ID, $ Data) {// Get Exclusive Chave $ Key = $ isto->GetKey ($ ID) - // criptografar os dados $ dados = $ isso->Criptografar ($ Data, Chave $) - $ Tempo = Tempo () - Se (!isset ($ isso->w_stmt)) {$ isso->w_stmt = $ isso->db->preparar("Substitua em sessões (ID, set_time, data, session_key) valores (?, ?, ?, ?)") -} $ isso->w_stmt->Bind_Param (`Siss`, $ ID, $ Tempo, $ Data, $ Key) - $ isto->w_stmt->Executar () - Retorno True-}
  • Imagem intitulada 2238751 11
    8. Criar função de destruição.
    Esta função exclui a sessão do banco de dados, é usada pelo PHP quando chamamos funções como session__Destroy ()-.

    Destrua a função:
    função destruir ($ ID) {if (!isset ($ isso->delete_stmt)) {$ isso->delete_stmt = $ isso->db->preparar("Excluir das sessões onde id = ?") -} $ isso->delete_stmt->Bind_Param (`S`, $ ID) - $ isto->delete_stmt->Executar () - Retorno True-}
  • Imagem intitulada 2238751 12
    9. Criar função GC (coletor de lixo).
    Esta função é a função do coletor de lixo é chamado para excluir sessões antigas. A frequência na qual esta função é chamada é determinada por duas diretivas de configuração, sessão.gc_probability e sessão.gc_divisor.

    GC () Função:
    função GC ($ max) {if (!isset ($ isso->gc_stmt)) {$ isso->gc_stmt = $ isso->db->preparar("Excluir das sessões onde set_time < ?") -} $ old = tempo () - $ max- $ isso->gc_stmt->bind_param (`` s `, $ idosos) - $ isso->gc_stmt->Executar () - Retorno True-}
  • Imagem intitulada 2238751 13
    10. Crie a função GetKey.
    Esta função é usada para obter a chave exclusiva para criptografia da tabela de sessões. Se não houver sessão, basta retornar uma nova chave aleatória para criptografia.

    GetKey () Função:
    função privada getkey ($ ID) {if (!isset ($ isso->key_stmt)) {$ isso->key_stmt = $ isso->db->preparar("Selecione Session_key das sessões onde id = ? Limite 1") -} $ isso->key_stmt->Bind_Param (`S`, $ ID) - $ isto->key_stmt->Execute () - $ isso->key_stmt->store_result () - se ($ isso->key_stmt->num_rows == 1) {$ isso->key_stmt->BIND_RESULT (US $ KEY) - $ isso->key_stmt->FETCH () - Retornar $ Key-} else {$ random_key = hash (`sha512`, uniqid (mt_rand (1, mt_getrandmax ()), true)) - return $ aleatório_key-}}
  • Imagem intitulada 2238751 14
    11. Criar criptografar e descriptografar funções.
    Essas funções criptografam os dados das sessões, elas usam uma chave de criptografia do banco de dados que é diferente para cada sessão. Nós não usamos diretamente essa chave na criptografia, mas usamos para tornar a chave hash ainda mais aleatória.

    Criptografar () e descriptografar () funções:
    Função privada Criptografar ($ Data, $ Key) {$ sal = `ch!swe!retrexu7w6Bedrup7usuduh9thed2chege * ewr4n39 = e @ Rasp7c-pH @ pH `- $ tecla = substr (hash (` sha256 `, $.$ chave.$ sal), 0, 32) - $ iv_size = mcrypt_get_iv_size (mcrypt_rijndael_256, mcrypt_mode_ecb) - $ iv = mcrypt_create_iv ($ iv_size, mcrypt_rand) - $ criptografado = base64_encode (mcrypt_rijndael_256, $ tecla, $ dados, mcrypt_mode_ecb, $ iv) ) -Return $ criptografado-} função privada descriptografar ($ dados, $ tecla) {$ sal = `ch!swe!retrexu7w6Bedrup7usuduh9thed2chege * ewr4n39 = e @ Rasp7c-pH @ pH `- $ tecla = substr (hash (` sha256 `, $.$ chave.$ sal), 0, 32) - $ iv_size = mcrypt_get_i_size (mcrypt_rijndael_256, mcrypt_mode_ecb) - $ iv = mcrypt_create_iv ($ iv_size, mcrypt_rand) - $ descriptografado = mcrypt_decrypt (mcrypt_rijndael_256, $ tecla, base64_demode ($ data), mcrypt_mode_ecb, $ IV ) - $ descriptografado = rtrim ($ descriptografado, " 0") -Return $ descriptografado-}
  • Imagem intitulada 2238751 15
    12. Classe final.
    Aqui acabamos de terminar as classes curly brackets:

    Classe final:
    }
  • Método 3 de 3:
    Criando páginas com sessões
    1. Imagem intitulada 2238751 16
    1. Usando sessões com o gerenciador de sessão personalizado.
    Abaixo está como você iniciaria uma nova sessão - você precisaria incluir isso em todas as páginas que deseja acessar as sessões, usá-lo em vez de session_start ()-

    Iniciando uma sessão:
    requer (`sessão.aula.PHP `) - $ session = nova sessão () - // definido como true se estiver usando HTTPS $ session->start_session (`_ s`, false) - $ _ sessão [`alguma coisa`] = `um valor.`-echo $ _Session [` alguma coisa `]-

    Pontas

    Compartilhe na rede social:
    Semelhante