Cómo crear un sistema de administración de sesión seguro en php y mysql

Esta guía le mostrará cómo puede almacenar sus sesiones de forma segura en una base de datos MySQL. También cifraremos todos los datos de la sesión que entran en la base de datos, lo que significa que si alguien logra piratear la base de datos, todos los datos de la sesión se cifran en cifrado AES de 256 bits.

Pasos

Método 1 de 3:
Configurar la base de datos MySQL
  1. Imagen titulada 2238751 1
1. Crear una base de datos MySQL.
En esta guía crearemos una base de datos llamada "segura_sessions".
Ver cómo Create-a-Database-in-phpmyadmin.
O puede usar el código SQL a continuación se creará uno para usted.

Crear código de la base de datos:
Crear base de datos `Secure_Sessions` -
Nota: algunos servicios de alojamiento no le permiten crear una base de datos a través de PHPMYAdmin, aprenda cómo hacerlo en CPANEL.
  • Imagen titulada 2238751 2
    2. Crear un usuario con solo seleccionar, insertar y eliminar privilegios.
    Esto significa que si alguna vez hubo una violación de la seguridad en nuestro script, el hacker no podía dejar las tablas de nuestra base de datos.Si eres realmente paranoico, crea un usuario diferente para cada función.

  • Usuario: "sec_user"
  • Contraseña: "ekcgzr59za2bewu"


  • Crear código de usuario:
    Cree `SEC_USER` @ `localhost` identificado por `ekcgzr59za2bewu`-beca Seleccione, inserte, actualice, elimine en `Secure_Sessions`.* A `sec_user` @ `localhost`-

    Nota: es una buena idea cambiar la contraseña en el código anterior cuando se ejecuta en su propio servidor. (Asegúrate de cambiar su código PHP también.) Recuerde que no necesita ser una contraseña que pueda recordar, por lo que hacer que sea lo más complicado posible. Aquí está un Contraseña aleatoria generador.
  • Imagen titulada 2238751 3
    3. Crea una tabla MySQL llamada "sesiones".
    El código a continuación crea una tabla con 4 campos (ID, Set_Time, Data, Session_Key).

    Crear el "sesiones" mesa:
    Crea Tabla `Sessions` (`ID` CHAR (128) NO NULL,` Set_Time` Char (10) No NULL, `DATOS` TEXT NO NULL,` SESSCHE_KEY` CHAR (128) NO NULL, CLAVE PRIMARIO (`ID`) ) Motor = InnoDB Predeterminado Chartset = latin1-
    Utilizamos el tipo de datos de CHAR para los campos, conocemos la longitud de, como los campos "identificación" y "session_key" Siempre tendrá 128 caracteres de largo. Usar char aquí ahorra en la potencia de procesamiento.
  • Método 2 de 3:
    Crear sesión.clase.archivo php
    1. Imagen titulada 2238751 4
    1. Crear clase.
    Para iniciar una nueva clase, deberá ingresar el código a continuación:

    Nueva clase:
    sesión de clase {
  • Imagen titulada 2238751 5
    2. Crear __Construct Function.
    Esta función se llamará cada vez que creamos una nueva instancia de un objeto usando la clase `Session`. Puede leer la función PHP __Construct aquí.
    Esta función establece nuestro manejador de sesión personalizado para que esté disponible para su uso tan pronto como la clase sea instanciada (i.mi., hecho / construido / construido).

    Función de __Consuct:
    Función __Construct () {// Establezca nuestras funciones de sesión personalizadas.session_set_save_handler (matriz ($ esta, `abre`), matriz ($ esto, `cierre`), matriz ($ esta, `lee`), matriz ($ esto, `escribe`), matriz ($ esto, `destruye` ), matriz ($ esto, `gc`)) - // Esta línea evita efectos inesperados cuando se usan objetos como manejadores guardados.registrar_shutdown_function (`session_write_close`) -}
  • Imagen titulada 2238751 6
    3. Crear función de inicio_session.
    Esta función se llamará cada vez que desee iniciar una nueva sesión, usela en lugar de la sesión_start ()-. Vea los comentarios en el código para ver lo que hace cada línea.

    Función de inicio_session:
    función start_session ($ session_name, $ seguro) {// Asegúrese de que la cookie de sesión no es accesible a través de jаvascript.$ httponly = true - // Algoritmo de hash para usar para la sesión. (Use Hash_algos () para obtener una lista de los hashes disponibles.) $ session_hash = `sha512` - // Compruebe si la hash está disponible (in_array ($ session_hash, hash_algos ())) {// configurar la función tiene la función.ini_set (`sesión.hash_function `, $ session_hash) -} // cuántas bits por carácter del hash.// Los valores posibles son `4` (0-9, A-F), `5` (0-9, A-V) y `6` (0-9, A-Z, A-Z, "-", ",").ini_set (`sesión.hash_bits_per_character `, 5) - // forzar la sesión solo para usar cookies, no variables de URL.ini_set (`sesión.use_only_cookies `, 1) - // Obtenga los parámetros de cookie de sesión $ cookieparams = session_get_cookie_params () - // Establezca los parámetrossession_set_cookie_params ($ cookieparams ["toda la vida"], $ cookieparams ["camino"], $ cookieparams ["dominio"], $ seguro, $ Httponly) - // CAMBIAR EL NOMBRE DE SESIÓN SESSCHE_NAME ($ SESSION_NAME) - // Ahora, gatos iniciamos el sessionsion_start () - // Esta línea regenera la sesión y elimina el anterior. // también genera una nueva clave de cifrado en la base de datos. session_regenerate_id (verdadero) -}
  • Imagen titulada 2238751 7
    4. Crear una función abierta.
    Esta función será convocada por las sesiones de PHP cuando iniciemos una nueva sesión, lo usamos para iniciar una nueva conexión de base de datos.

    Función abierta:
    Función Abrir () {$ host = `localhost` - $ user = `sec_user` - $ pass = `ekcgzr59zaaa2bewu` - $ Name = `Secure_Sessions` - $ MySQLi = Nuevo MySQLi ($ host, $ usuario, $ PASS, $ NOMBRE - - $ esto->db = $ MySQLi-Devolver True-}
  • Imagen titulada 2238751 8
    5. Crear una función de cierre.
    Esta función se llamará cuando las sesiones quieran estar cerradas.

    Función de cierre:
    Función Cerrar () {$ esta->db->Cerrar () - Devolver true-}
  • Imagen titulada 2238751 9
    6. Crear función de lectura.
    Esta función será llamada PHP cuando intentemos acceder a una sesión, por ejemplo, cuando usamos eco $ _Session [`algo`]-. Debido a que podría haber muchas llamadas a esta función en una sola página, aprovechamos las declaraciones preparadas, no solo para la seguridad, sino también para el rendimiento. Solo preparamos la declaración una vez que podemos ejecutarlo muchas veces.
    También desciframos los datos de la sesión que se cifran en la base de datos. Estamos utilizando el cifrado AES de 256 bits en nuestras sesiones.

    Función de lectura:
    Lectura de la función ($ ID) {if (!isset ($ esto->read_stmt)) {$ esta->read_stmt = $ esto->db->preparar("Seleccione los datos de las sesiones donde id = ? Límite 1"- -} $ esto->leer_stmt->bind_param (`s`, $ id) - $ esto->leer_stmt->Ejecutar () - $ esto->leer_stmt->store_result () - $ esto->leer_stmt->Bind_Result ($ DATA) - $ ESTO->leer_stmt->fetch () - $ clave = $ esto->GetKey ($ ID) - $ DATA = $ ESTA->Decrypt ($ DATA, $ CLAVE) -RETURN $ DATA-}
  • Imagen titulada 2238751 10
    7. Crear función de escritura.
    Esta función se usa cuando asigna un valor a una sesión, por ejemplo, $ _Session [`algo`] = `otra cosa`-. La función cifra todos los datos que se insertan en la base de datos.

    Función de escritura:
    Función Escribir ($ ID, $ DATA) {// Obtener tecla Única $ KEY = $ ESTA->GetKey ($ ID) - // Cifre los datos $ DATA = $ ESTA->Encrypt ($ DATA, $ CLAVE) - $ TIME = TIEMPO () - SI (!isset ($ esto->w_stmt)) {$ esta->w_stmt = $ esto->db->preparar("Reemplazar en los valores de Sessions (ID, Set_time, Data, Session_Key) (?, ?, ?, ?)"- -} $ esto->w_stmt->Bind_Param (`SISS`, $ ID, $ TIEMPO, $ DATA, $ CLAVE) - $ ESTA->w_stmt->Ejecutar () - devolver true-}
  • Imagen titulada 2238751 11
    8. Crear la función de destrucción.
    Esta función elimina la sesión de la base de datos, se utiliza por PHP cuando llamamos funciones como Session__Destroy ()-.

    Destruir la función:
    función destruir ($ id) {si (!isset ($ esto->Delete_stmt)) {$ esta->Delete_stmt = $ esto->db->preparar("Eliminar de las sesiones donde id = ?"- -} $ esto->Delete_stmt->bind_param (`s`, $ id) - $ esto->Delete_stmt->Ejecutar () - devolver true-}
  • Imagen titulada 2238751 12
    9. Crear función GC (recolector de basura).
    Esta función es la función del colector de basura, se llama para eliminar las sesiones antiguas. La frecuencia en la que se llama esta función está determinada por dos directivas de configuración, sesión.GC_Probability and Session.gc_divisor.

    Función GC ():
    Función GC ($ max) {si (!isset ($ esto->gc_stmt)) {$ esta->gc_stmt = $ esto->db->preparar("Eliminar de las sesiones donde set_time < ?"- -} $ viejo = tiempo () - $ max- $ esta->gc_stmt->bind_param (`s`, $ viejo) - $ esto->gc_stmt->Ejecutar () - devolver true-}
  • Imagen titulada 2238751 13
    10. Crear la función GetKey.
    Esta función se utiliza para obtener la clave única para el cifrado de la tabla de sesiones. Si no hay una sesión, simplemente devuelva una nueva clave aleatoria para el cifrado.

    GetKey () Función:
    Función privada GetKey ($ ID) {if (!isset ($ esto->key_stmt)) {$ esto->key_stmt = $ esto->db->preparar("Seleccione Session_Key de las sesiones donde id = ? Límite 1"- -} $ esto->key_stmt->bind_param (`s`, $ id) - $ esto->key_stmt->Ejecutar () - $ esto->key_stmt->store_result () - si ($ esto->key_stmt->num_rows == 1) {$ esta->key_stmt->bind_result ($ clave) - $ esto->key_stmt->fetch () - devuelva $ key-} otra cosa {$ random_key = hash (`sha512`, uniqid (mt_rand (1, mt_getrandmax ()), verdadero)) - devolver $ random_key-}}
  • Imagen titulada 2238751 14
    11. Crear funciones de cifrado y descifrar.
    Estas funciones cifran los datos de las sesiones, utilizan una clave de cifrado de la base de datos que es diferente para cada sesión. No utilizamos directamente esa clave en el cifrado, pero lo usamos para hacer que la llave haya más aleatorio.

    Cifrar () y descifrar () Funciones:
    Cifrado de la función privada ($ DATA, $ CLAVE) {$ SALT = `CH!swe!retrogu7w6bedrup7usuduh9thed2chege * ewr4n39 = e @ rasp7c-ph @ ph `- $ Key = Substr (hash (` sha256 `, $ sal.clave.$ sal), 0, 32) - $ iv_size = mcrypt_get_iv_size (mcrypt_rijndael_256, mcrypt_mode_ecb) - $ iv = mcrypt_create_iv ($ iv_size, mcrypt_rand) - $ cifrado = base64_encode (McRypt_Encrypt (McRypt_Rijndael_256, Key, $ DATA, MCRYPT_MODE_ECB, $ IV) ) -return $ cifrado-} Función privada Decrypt ($ DATA, CLAVE DE $) {$ SALT = `CH!swe!retrogu7w6bedrup7usuduh9thed2chege * ewr4n39 = e @ rasp7c-ph @ ph `- $ Key = Substr (hash (` sha256 `, $ sal.clave.$ sal), 0, 32) - $ iv_size = mcrypt_get_iv_size (mcrypt_rijndael_256, mcrypt_mode_ecb) - $ iv = mcrypt_create_iv ($ iv_size, mcrypt_rand) - $ descifrado = mcrypt_decrypt (McRypt_Rijndael_256, $ Key, Base64_DECODE ($ DATOS), MCRYPT_MODE_ECB, $ IV ) - $ descifrado = rtrim ($ descifrado, " 0") -Reurn $ descifrado-}
  • Imagen titulada 2238751 15
    12. Clase final.
    Aquí solo terminamos con las clases soportes rizados:

    Clase final:
    }
  • Método 3 de 3:
    Creando páginas con sesiones
    1. Imagen titulada 2238751 16
    1. Usando sesiones con el administrador de la sesión personalizado.
    A continuación se muestra cómo comenzaría una nueva sesión, deberías incluir esto en cada página que desea acceder a las sesiones, Úsalo en lugar de session_start ()-

    Comenzando una sesión:
    requerir (`Sesión.clase.php `) - $ session = nueva sesión () - // establecida en verdadero si usa https $ session->start_session (`_ s`, falso) - $ _ session [`algo`] = `un valor.`-Acho $ _Session [` algo `]-

    Consejos

    Artículos Relacionados