Como criar uma sessão segura do sistema de gestão em php e mysql

3 Métodos:Define o banco de dados MySQLCria um arquivo de sesion.class.phpCriar páginas com sessões

Este guia irá mostrar-lhe como poupar sessões com segurança em um banco de dados mySQL. Você também vai aprender a criptografar todos os dados da sessão para ir para o banco de dados, ou se alguém conseguir invadir o banco de dados, todas as sessões de dados será com criptografia de 256 bits AES.

método 1
Define o banco de dados MySQL
1
Cria um banco de dados MySQL.
Neste guia, vamos criar um banco de dados chamado sesiones_seguras.
Observe como um banco de dados é criado no phpMyAdmin.
Ou você pode usar o código SQL que se segue para criar uma.

Código cria o banco de dados:
CRIAR DATABASE `sesiones_seguras` -

Nota: Alguns serviços não permitem que você crie um banco de dados com o phpMyAdmin, aprender a fazer no cPanel.
  • 2
    Criar um usuário que só tem privilégios para SELECT, INSERT, e DELETE.
    Então, se houvesse qualquer violação do nosso script de segurança, o hacker não pode excluir tabelas do banco de dados. Se você é realmente paranóico, você cria um usuário diferente para cada função.

  • Nome de usuário: "sec_user"
  • password: "eKcGZr59zAa2BEWU"


  • Criar o código do usuário:
    CRIAR USUÁRIO `Sec_user`@`Localhost` IDENTIFICADOS BY `EKcGZr59zAa2BEWU`-GRANT SELECIONAR, INSERÇÃO, ACTUALIZAÇÃO, APAGAR ON `sesiones_seguras`.* TO `Sec_user`@`Localhost`-

    Nota: Uma boa idéia seria a de alterar a senha acima código para ser executado em seu próprio servidor (certifique-se também alterar o código PHP). Lembre-se que você não precisa se lembrar da senha, para que possa fazer o mais difícil possível. Aqui é um gerador senhas aleatórias.
  • 3
    Cria uma tabela MySQL chamados "sessões".
    O código que se segue irá criar uma tabela com 4 campos (id, tempo, dados, clave_sesion).

    Criar a tabela "sessões":
    CRIAR TABELA `sesiones` (`id` CHAR(128) NÃO NULL,`horario` CHAR(10) NÃO NULL,`data` texto NÃO NULL,`clave_sesion` CHAR(128) NÃO NULL,PRIMÁRIA KEY (`id`)) MOTOR=InnoDB PADRÃO CHARSET=latin1-

    Use o tipo de dados CHAR para campos com comprimento conhecido, como campos "identidade" e "clave_sesion" eles sempre terão 128 caracteres. CHAR usando o poder de processamento de reposição.
  • método 2
    Cria um arquivo de sesion.class.php
    1
    Crie uma classe.
    Para inicializar uma nova classe, você precisa inserir o seguinte código:

    nova classe:
    classe sessão {
  • 2
    Criar a função __construct.
    Ele irá chamar esta função sempre que você criar uma nova instância de um objeto usando a classe `sessão`. Você pode ler sobre o _construct função PHP aqui.
    Isso define o nosso manipulador de sessão personalizado para torná-lo disponível assim que a classe é inicializada (ou seja, ele é feito, compilar ou construir).

    função __construct:
    função __construct() {// Definir as funções da sessão personalizada.session_set_save_handler(ordem($ this-, `Open`), ordem($ this-, `Fechar`), ordem($ this-, "Read"), ordem($ this-, `Escrever`), ordem($ this-, `Destroy`), ordem($ this-, `Gc`))-// Esta linha impede inesperado quando usando objetos como efeitos manipuladores armazenados.register_shutdown_function(`Session_write_close`)-}


  • 3
    Crie uma função inicio_sesion.
    Esta função será chamado sempre que alguém quer iniciar uma nova sessão, em vez de usar session_start () -. Olhe para os comentários no código para ver o que cada linha.

    função inicio_sesion:
    função inicio_sesion($ session_name, $ garantir) {// Verifique se o cookie de sessão não pode ser acessado por javascript.$ httponly = verdadeiro-// Algoritmo de hash para uso com idsessão. (Utilize hash_algos () para ver uma lista de haxixe disponível)$ session_hash = `SHA512`-// Verifique se um hash disponíveisse (in_array($ session_hash, hash_algos())) {// Defina a função hash.ini_set(`Session.hash_function`, $ session_hash)-}// Quantos bits por hash de caráter.// 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(`Session.hash_bits_per_character`, 5)-// Forçar a sessão para utilizar apenas cookies, há variáveis ​​de URL.ini_set(`Session.use_only_cookies`, 1)-// Obter os parâmetros do cookie de sessão$ cookieParams = session_get_cookie_params()-// Defina os parâmetrossession_set_cookie_params($ cookieParams, $ cookieParams, $ cookieParams, $ garantir, $ httponly)-// Altere o nome da sessãosession_name($ session_name)-// Nós podemos agora fazer logonsession_start()-// Esta linha regenera e elimina a sessão anterior.// Também gera uma nova chave de criptografia no banco de dados. session_regenerate_id(verdadeiro)-}
  • 4
    Crie uma função aberta.
    sessões PHP irá chamar esta função para iniciar uma nova sessão, usá-lo para iniciar uma nova conexão no banco de dados.

    função de abertura:
    função aberto() {$ host = `Localhost`-$ user = `Sec_user`-$ passagem = `EKcGZr59zAa2BEWU`-name $ = `Sesiones_seguras`-$ mysqli = novo mysqli($ host, $ user, $ passagem, name $)-$ this--gt;db = $ mysqli-retorno verdadeiro-}
  • 5
    Cria uma função próxima.
    Esta função será chamada quando a sessão querem ser fechado.

    perto função:


    função perto() {$ this--gt;db-gt;perto()-retorno verdadeiro-}
  • 6
    Criar uma função de ler.
    PHP irá chamar esta função quando você tenta acessar uma sessão, por exemplo, quando você usa echo $ _SESSION-. Como podem existir muitas chamadas para esta função em uma única página, tirar proveito de declarações preparadas, não só para a segurança, mas também para o desempenho. Basta preparar a declaração de uma vez e, em seguida, executá-lo muitas vezes.
    Ele também decodifica os dados de sessão criptografados no banco de dados. Você vai usar a criptografia AES de 256 bits em sessões.

    função de leitura:
    função ler($ id) {se(!isset($ this--gt;read_stmt)) {$ this--gt;read_stmt = $ this--gt;db-gt;preparado("dados de selecionar a partir de sessões WHERE id =? LIMIT 1")-}$ this--gt;read_stmt-gt;bind_param(`S`, $ id)-$ this--gt;read_stmt-gt;EXECUTAR()-$ this--gt;read_stmt-gt;store_result()-$ this--gt;read_stmt-gt;bind_result($ dados)-$ this--gt;read_stmt-gt;BUSQUE()-$ key = $ this--gt;getKey($ id)-$ dados = $ this--gt;descriptografar($ dados, $ key)-retorno $ dados-}
  • 7
    Crie uma função para escrever.
    Esta função é usada quando você atribuir um valor a uma sessão, por exemplo $ _SESSION = "outro cosa`-. A função codifica todos os dados para inserção no banco de dados.

    função de escrever:
    função escrever($ id, $ dados) {// Obter uma chave única$ key = $ this--gt;getKey($ id)-// Criptografa dados$ dados = $ this--gt;criptografar($ dados, $ key)-$ time = tempo()-se(!isset($ this--gt;w_stmt)) {$ this--gt;w_stmt = $ this--gt;db-gt;preparado("REPLACE INTO sessões (id, tempo, dados, clave_sesion) VALUES (?,?,?,?)")-}$ this--gt;w_stmt-gt;bind_param("SISS `, $ id, $ time, $ dados, $ key)-$ this--gt;w_stmt-gt;EXECUTAR()-retorno verdadeiro-}
  • 8
    Criar uma função para destruir.
    Este recurso elimina a base de dados de sessão, o PHP usa ao chamar funções como session__destroy () -.

    função de destruir;
    função destruir($ id) {se(!isset($ this--gt;delete_stmt)) {$ this--gt;delete_stmt = $ this--gt;db-gt;preparado("DELETE FROM sessões onde id =?")-}$ this--gt;delete_stmt-gt;bind_param(`S`, $ id)-$ this--gt;delete_stmt-gt;EXECUTAR()-retorno verdadeiro-}


  • 9
    Cria um gc função (coletor de lixo, por sua sigla em Inglês).
    Ele é chamado a função de coletor de lixo para remover sessões de idade. A frequência com que você chamar essa função será determinada pelas duas directivas de configuração, session.gc_probability e session.gc_divisor.

    gc () função:
    função gc($ max) {se(!isset($ this--gt;gc_stmt)) {$ this--gt;gc_stmt = $ this--gt;db-gt;preparado("DELETE FROM sessões onde o Schedule lt; ?")-}$ antiga = tempo() - $ max-$ this--gt;gc_stmt-gt;bind_param(`S`, $ antiga)-$ this--gt;gc_stmt-gt;EXECUTAR()-retorno verdadeiro-}
  • 10
    Cria uma função getKey.
    Esta função é usada para obter a única chave para encriptar a tabela de sessão. Se há uma sessão, simplesmente devolve uma nova chave aleatória para criptografar.

    função getKey ():
    privado função getKey($ id) {se(!isset($ this--gt;key_stmt)) {$ this--gt;key_stmt = $ this--gt;db-gt;preparado("Clave_sesion SELECIONE de onde id = sessões? LIMIT 1")-}$ this--gt;key_stmt-gt;bind_param(`S`, $ id)-$ this--gt;key_stmt-gt;EXECUTAR()-$ this--gt;key_stmt-gt;store_result()-se($ this--gt;key_stmt-gt;num_rows == 1) {$ this--gt;key_stmt-gt;bind_result($ key)-$ this--gt;key_stmt-gt;BUSQUE()-retorno $ key-} mais {$ random_key = de hash(`SHA512`, uniqid(mt_rand(1, mt_getrandmax()), verdadeiro))-retorno $ random_key-}}
  • 11
    Cria as funções de criptografia e descriptografia.
    Estas funções criptografar sessões de dados com uma chave de cifra da base de dados, que é diferente para cada sessão. Não usar diretamente a chave de criptografia, mas você vai usar para criar a chave de hash ainda mais aleatória.

    fuciones criptografar () e descriptografar ():
    privado função criptografar($ dados, $ key) {$ sal = `CH! Swe! RetReGu7W6bEDRup7usuDUh9THeD2CHeGE * ewr4n39 = E @ rAsp7c-Ph @ pH`-$ key = substr(de hash(`SHA256`, $ sal.$ key.$ 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_encrypt(MCRYPT_RIJNDAEL_256, $ key, $ dados, MCRYPT_MODE_ECB, $ iv))-retorno $ criptografado-}privado função descriptografar($ dados, $ key) {$ sal = `CH! Swe! RetReGu7W6bEDRup7usuDUh9THeD2CHeGE * ewr4n39 = E @ rAsp7c-Ph @ pH`-$ key = substr(de hash(`SHA256`, $ sal.$ key.$ sal), 0, 32)-$ iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB)-$ iv = mcrypt_create_iv($ iv_size, MCRYPT_RAND)-$ descriptografado = MCRYPT_DECRYPT(MCRYPT_RIJNDAEL_256, $ key, base64_decode($ dados), MCRYPT_MODE_ECB, $ iv)-retorno $ descriptografado-}
  • 12
    Fechar classes.
    Aqui simplesmente fechar as classes com chaves:

    Fechar classes:
    }
  • método 3
    Criar páginas com sessões
    1
    administrador usar sessões sessões personalizado.
    O seguinte mostra como iniciar uma sessão de Novo- seria necessário incluir isso em todas as páginas que você deseja acessar as sessões, Usá-lo em vez de session_start () -

    log:
    exigir(`Sesion.class.php`)-$ session = novo sessão()-// Definir como true se você usar https$ session-gt;inicio_sesion(`_s`, falso)-$ _SESSION = `Um valor.`-eco $ _SESSION-
    Artigos Relacionados