Registro de miembros dudoso php. Creamos un increíble sistema de registro simple en PHP y MySQL

Registro de miembros dudoso php. Creamos un increíble sistema de registro simple en PHP y MySQL

21.11.2021

Para dividir a los visitantes del sitio en ciertos grupos, se debe instalar un pequeño sistema en el sitio. registro php... Por lo tanto, divide condicionalmente a los visitantes en dos grupos de visitantes aleatorios y en un grupo más privilegiado de usuarios a los que proporciona información más valiosa.

En la mayoría de los casos, se utiliza un sistema de registro más simplificado, que está escrito en php en un archivo. register.php.

Entonces, divagamos un poco, y ahora veremos más de cerca el archivo de registro.

Archivo Register.php

Para que no le tome mucho tiempo, crearemos un sistema que recopilará usuarios, tomando un mínimo de información de contacto de ellos. En este caso, ingresaremos todo en la base de datos mysql. Para la mayor velocidad de la base de datos, crearemos la tabla de usuarios en el formato MyISAM y en la codificación utf-8.

¡Nota! Todos los scripts deben escribirse siempre con la misma codificación. Todos los archivos del sitio y la base de datos MySql deben tener la misma codificación. Las codificaciones más comunes son UTF-8 y Windows-1251.

¿Por qué necesita escribir todo en una codificación? Hablaremos más adelante. Hasta entonces, tome esta información como la regla más estricta para la creación de scripts, de lo contrario, habrá problemas con la creación de scripts en el futuro. Está bien, por supuesto, pero pierdes mucho tiempo buscando errores en el guión.

¿Cómo funcionará el guión en sí?

Queremos simplificar todo y obtener resultados rápidos. Por lo tanto, recibiremos de los usuarios solo el nombre de usuario, el correo electrónico y la contraseña. Y para protegernos de los robots de spam, instalaremos un pequeño captcha. De lo contrario, algún chico de Londres escribirá un pequeño analizador robot que llenará toda la base de datos con usuarios falsos en unos minutos y se regocijará con su genio e impunidad.

Aquí está el guión en sí. Todo está escrito en un archivo. register.php:

! `; // signo de interrogación rojo $ sha = $ sh. "scripts / pro /"; // ruta a la carpeta principal $ bg = `bgcolor =" # E1FFEB "`; // color de fondo de las líneas?> Ejemplo de script de registro register.php style.css "/>

En este caso, el guión se refiere a sí mismo. Y es un formulario y un procesador de los datos ingresados ​​en el formulario. Tenga en cuenta que el archivo está comprimido en un archivo zip y contiene el archivo de configuración config.php, el volcado de la base de datos de los usuarios, el archivo que contiene las funciones auxiliares.php, el archivo style.css y el archivo register.php en sí. También existen varios archivos que se encargan del funcionamiento y generación de símbolos captcha.

Hoy consideraremos la explotación de una vulnerabilidad crítica de 1 día en el popular CMS Joomla, que retumbó en Internet a finales de octubre. Hablaremos de vulnerabilidades con números CVE-2016-8869, CVE-2016-8870 y CVE-2016-9081... Los tres provienen de una pieza de código que languideció en las entrañas del framework durante cinco largos años, esperando su hora para liberarse y traer consigo el caos, los sitios pirateados y las lágrimas de los usuarios inocentes de este Joomla. Solo los desarrolladores más valientes y atrevidos, cuyos ojos están rojos por la luz de los monitores, y los teclados están llenos de migas de pan, pudieron desafiar a los espíritus malignos furiosos y apoyar la cabeza en el altar de los arreglos.

ADVERTENCIA

Toda la información se proporciona solo con fines informativos. Ni el consejo editorial ni el autor son responsables de los posibles daños causados ​​por los materiales de este artículo.

Cómo empezó todo

El 6 de octubre de 2016, Demis Palma creó un tema en Stack Exchange, en el que preguntaba: ¿por qué, de hecho, en la versión 3.6 de Joomla hay dos métodos para registrar usuarios con el mismo nombre register ()? El primero está en UsersControllerRegistration y el segundo está en UsersControllerUser. Damis quería saber si el método UsersControllerUser :: register () se está usando en alguna parte, o si esto es solo un anacronismo evolutivo que queda de la vieja lógica. Le preocupaba el hecho de que incluso si este método no fuera utilizado por ninguna vista, aún podría invocarse con una solicitud generada. A lo cual recibí una respuesta de un desarrollador con el sobrenombre de itoctopus, quien confirmó que el problema realmente existe. Y envió un informe a los desarrolladores de Joomla.

Otros eventos se desarrollaron de la manera más rápida. El 18 de octubre, los desarrolladores de Joomla aceptaron un informe de Damis, quien para entonces había esbozado una PoC para permitir el registro de usuarios. Publicó una nota en su sitio web, donde describió el problema que había encontrado y sus pensamientos al respecto. El mismo día, se lanza una nueva versión de Joomla 3.6.3, que aún contiene el código vulnerable.

Después de eso, Davide Tampellini resuelve el error al estado de registro no de un simple usuario, sino de un administrador. Y ya el 21 de octubre llega un nuevo caso al equipo de seguridad de Joomla. Ya está hablando de escalada de privilegios. El mismo día, aparece un anuncio en el sitio de Joomla de que el martes 25 de octubre se lanzará la próxima versión con el número de serie 3.6.3, que corrige una vulnerabilidad crítica en el núcleo del sistema.

El 25 de octubre, el equipo de ataque de seguridad de Joomla encuentra el problema final, que es creado por un fragmento de código que descubrió Damis. Luego, una confirmación con fecha del 21 de octubre con el nombre discreto Prepare 3.6.4 Stable Release se envía a la rama principal del repositorio oficial de Joomla, que corrige el desafortunado error.

Después de esta presentación, numerosas personas interesadas se conectan a la reunión de desarrolladores: comienzan a desenredar la vulnerabilidad y a preparar exploits.

El 27 de octubre, el investigador Harry Roberts carga un exploit listo para usar en el repositorio de Xiphos Research que puede cargar un archivo PHP en un servidor con un CMS vulnerable.

Detalles

Bueno, hemos terminado con los antecedentes, pasemos a la parte más interesante: el análisis de la vulnerabilidad. Como versión de prueba, instalé Joomla 3.6.3, por lo que todos los números de línea serán relevantes para esta versión en particular. Y todas las rutas a los archivos que ve a continuación se indicarán en relación con la raíz del CMS instalado.

Gracias al hallazgo de Damis Palma sabemos que existen dos métodos que realizan el registro de usuarios en el sistema. El primero es utilizado por el CMS y se encuentra en el archivo /components/com_users/controllers/registration.php:108. El segundo (el que necesitamos llamar) vive en /components/com_users/controllers/user.php:293. Echemos un vistazo más de cerca.

286: / ** 287: * Método para registrar un usuario. 288: * 289: * @return boolean 290: * 291: * @since 1.6 292: * / 293: registro de función pública () 294: (295: JSession :: checkToken ("post") o jexit (JText :: _ ("JINVALID_TOKEN")); ... 300: // Obtener los datos del formulario 301: $ data = $ this-> input-> post-> get ("user", array (), "array") ;. .. 315: $ return = $ model-> validate ($ form, $ data); 316: 317: // Compruebe si hay errores. 318: if ($ return === false) 319: (... 345: / / Finalizar el registro.346: $ return = $ model-> register ($ data);

Aquí solo he dejado líneas interesantes. La versión completa del método vulnerable se puede ver en el repositorio de Joomla.

Averigüemos qué sucede durante el registro de usuario normal: qué datos se envían y cómo se procesan. Si el registro de usuario está habilitado en la configuración, entonces el formulario se puede encontrar en http: //joomla.local/index.php/component/users/? View = registration.


Una solicitud de registro de usuario legítima se parece a la siguiente captura de pantalla.


El componente com_users es responsable de trabajar con los usuarios. Preste atención al parámetro de la tarea en la solicitud. Tiene el formato $ controller. $ Method. Echemos un vistazo a la estructura del archivo.

Los nombres de los scripts en la carpeta. controladores corresponden a los nombres de los controladores llamados. Dado que nuestra solicitud ahora contiene $ controller = "registration", el archivo se llamará registro.php y su método register ().

Atención, pregunta: ¿cómo pasar el proceso de registro a una vulnerabilidad en el código? Probablemente ya lo hayas adivinado. Los nombres de los métodos vulnerables y reales son los mismos (registro), por lo que solo necesitamos cambiar el nombre del controlador llamado. ¿Dónde está ubicado el controlador vulnerable? Eso es correcto, en el archivo user.php... Resulta $ controlador = "usuario". Poniéndolo todo junto y obteniendo task = user.register. Ahora la solicitud de registro se procesa mediante el método que necesitamos.


Lo segundo que debemos hacer es enviar los datos en el formato correcto. Aquí todo es sencillo. El registro legítimo () espera de nosotros una matriz llamada jform, en la que pasamos los datos para el registro: nombre, inicio de sesión, contraseña, correo (vea la captura de pantalla con la solicitud).

  • /components/com_users/controllers/registration.php: 124: // Obtén los datos del usuario. 125: $ requestData = $ this-> input-> post-> get ("jform", array (), "array");

Nuestro barrio obtiene estos datos de una matriz denominada usuario.

  • /components/com_users/controllers/user.php: 301: // Obtén los datos del formulario. 302: $ datos = $ esto-> entrada-> post-> obtener ("usuario", matriz (), "matriz");

Por lo tanto, cambiamos los nombres de todos los parámetros en la solicitud de jfrom a user.

Nuestro tercer paso es encontrar un token CSRF válido, ya que sin él no habrá registro.

  • /components/com_users/controllers/user.php: 296: JSession :: checkToken ("publicación") o jexit (JText :: _ ("JINVALID_TOKEN"));

Parece un hash MD5 y puede tomarlo, por ejemplo, del formulario de autorización en el sitio /index.php/component/users/?view=login.


Ahora puede crear usuarios mediante el método deseado. Si todo salió bien, enhorabuena, acaba de explotar una vulnerabilidad. CVE-2016-8870"Falta verificación de permisos para registrar nuevos usuarios".

Así es como se ve en el método register () "en funcionamiento" del controlador UsersControllerRegistration:

  • /components/com_users/controllers/registration.php: 113: // Si el registro está deshabilitado - Redirigir a la página de inicio de sesión. 114: if (JComponentHelper :: getParams ("com_users") -> get ("allowUserRegistration") == 0) 115: (116: $ this-> setRedirect (JRoute :: _ ("index.php? Option = com_users & view = login ", falso)); 117: 118: devuelve falso; 119 :)

Y así en los vulnerables:

  • /components/com_users/controllers/user.php:

Sí, de ninguna manera.

Para entender el segundo problema, mucho más serio, enviemos la solicitud que hemos formado y rastreemos cómo se ejecuta en diferentes partes del código. Aquí está el fragmento que es responsable de validar los datos enviados por el usuario en un método de trabajo:

La continuación está disponible solo para los participantes

Opción 1. Únase a la comunidad del "sitio" para leer todos los materiales del sitio

La membresía en la comunidad dentro del período especificado le dará acceso a TODOS los materiales de Hacker, aumentará su descuento acumulativo personal y le permitirá acumular una puntuación Xakep profesional.

Si necesita que una de las secciones de su sitio esté disponible para un círculo de personas limitado pero indefinido, la forma más fácil de hacerlo es registrando y autorizando a los usuarios. Hay muchas formas de autenticar a los usuarios. Se pueden utilizar tanto herramientas de servidor web como herramientas de lenguaje de programación. Hablaremos del caso en el que se utilizan sesiones de PHP.

Probablemente le gustaría ver una forma más moderna de crear tal forma. Todavía tengo una presentación completa, moderna y actualizada, pero puede ver que el formulario de comentarios se puede construir utilizando técnicas orientadas a objetos en PHP.

Primero, analicemos todos los pasos que daremos a continuación. ¿Qué necesitamos siquiera? Necesitamos un script que registre a un usuario, autorice a un usuario, redirija al usuario a algún lugar después de la autorización. También necesitaremos crear una página que estará protegida contra el acceso de usuarios no autorizados. Para el registro y la autorización, necesitaremos crear formularios HTML. Almacenaremos información sobre los usuarios registrados en una base de datos. Esto significa que todavía necesitamos un script para conectarnos al DBMS. Todo nuestro trabajo será realizado por funciones que nosotros mismos escribiremos. Guardaremos estas funciones en un archivo separado.

Entonces, necesitamos los siguientes archivos:

  • conexión con DBMS;
  • funciones personalizadas;
  • autorización;
  • registro;
  • página protegida;
  • script de cierre del usuario;
  • un script que verifica el estado de autorización del usuario;
  • hoja de estilo para el diseño más simple de nuestras páginas.

Todo esto sería inútil si no tiene una tabla correspondiente en su base de datos. Inicie su herramienta de administración DBMS (PhpMyAdmin o línea de comando, lo que sea más conveniente) y ejecute la siguiente consulta en ella:

CREATE TABLE `users` (` id` int (11) NOT NULL AUTO_INCREMENT, `login` char (16) NOT NULL,` password` char (40) NOT NULL, `reg_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (` id`)) ENGINE = MyISAM DEFAULT CHARSET = utf8 AUTO_INCREMENT = 1;

Nombraré nuestros archivos de script así (todos estarán en el mismo directorio):

  • database.php;
  • functions.php;
  • login.php;
  • registration.php;
  • index.php;
  • logout.php;
  • checkAuth.php;
  • style.css.

Estoy seguro de que el propósito de cada uno de ellos está claro para ustedes. Comencemos con el script de conexión DBMS. Lo has visto antes. Simplemente guarde el código para este script en un archivo llamado database.php. Declararemos funciones personalizadas en el archivo functions.php. ¿Cómo funcionará todo esto? Un usuario no autorizado intenta acceder al documento protegido index.php, el sistema verifica si el usuario está autorizado, si el usuario no está autorizado, se le redirige a la página de autorización. En la página de autorización, el usuario debería ver un formulario de autorización. Vamos a hacerlo.

Autorización de usuario

Registrarse.



Ahora tenemos que darle a nuestra forma un cierto aspecto. Al mismo tiempo, definiremos las reglas para otros elementos. Les voy a dar el contenido completo de la hoja de estilo, adelantándome.

/ * archivo style.css * / .row (margin-bottom: 10px; width: 220px;) .row label (display: block; font-weight: bold;) .row input.text (font-size: 1.2em; padding: 2px 5px;) .to_reg (tamaño de fuente: 0.9em;). instrucción (tamaño de fuente: 0.8em; color: #aaaaaa; margin-left: 2px; cursor: predeterminado;) .error (color: red; margen izquierdo: 3px;)

Si todo se hace correctamente, debería tener lo siguiente en su navegador:

Por supuesto, todavía no tenemos un solo usuario registrado, y para iniciar sesión, debe registrarse. Hagamos un formulario de registro.

Registro de usuario

" />


Probablemente haya notado que hay variables PHP en el código HTML. Son el contenido de los atributos de los campos de texto en formularios, el contenido de los contenedores para mostrar errores. Pero no hemos inicializado estas variables. Vamos a hacer eso.

Registro de usuario

" />
El nombre de usuario solo puede contener caracteres latinos, números, símbolos "_", "-", ".". La longitud del nombre de usuario debe tener al menos 4 caracteres y no más de 16 caracteres
En la contraseña, puede usar solo caracteres latinos, números, símbolos "_", "!", "(", ")". La contraseña debe tener al menos 6 caracteres y no más de 16 caracteres
Repita la contraseña ingresada previamente


No hay ningún parámetro especificado en el atributo de acción de la etiqueta de formulario. En este caso, cuando se envíen los datos del formulario, se procesarán en el mismo script desde el que se enviaron. Entonces necesitamos escribir código que procese los datos del formulario. Pero primero, analicemos el algoritmo para su procesamiento.

Necesitamos que los campos de inicio de sesión y contraseña no estén vacíos. Luego, debe verificar que el inicio de sesión cumpla con los requisitos. La contraseña también debe cumplir con los requisitos descritos, y la contraseña repetida debe coincidir y, además, deben ser idénticas. Si alguna de estas condiciones no se cumple, se debe detener el procesamiento de los datos del formulario, se debe escribir la notificación correspondiente en la matriz de mensajes de error y se debe mostrar al usuario. Para comodidad del usuario, guardaremos el login ingresado por él (si lo indicó), escribiendo su valor en el arreglo $ fields.

Si todo está bien, en la ventana de su navegador, refiriéndose al documento registration.php, debería ver algo como esto:

Ahora, digamos que el usuario hace clic en el botón de registro sin completar los campos del formulario. Según nuestro algoritmo, el nombre de usuario y la contraseña no pueden estar vacíos. Si no se cumple esta condición, el registro no es posible. Tenemos en cuenta que el procesamiento de los datos del formulario se realiza en el script actual. Esto significa que debemos cambiar su código agregando las comprobaciones adecuadas. Inmediatamente estipularemos los siguientes controles. Si se ingresan tanto el nombre de usuario como la contraseña, debe verificar que cumplan con los requisitos especificados. Para verificar el nombre de usuario y la contraseña, crearemos funciones personalizadas en el archivo functions.php.

/ ** * functions.php * Archivo con funciones personalizadas * / // Incluir un archivo con parámetros para conectarse al DBMS require_once ("database.php"); // Comprobando la función de nombre de usuario checkLogin ($ str) (// Inicializa la variable con un posible mensaje de error $ error = ""; // Si no hay una cadena de inicio de sesión, devuelve un mensaje de error if (! $ Str) ($ error = "No ingresó el nombre de usuario"; return $ error;) / ** * Verifique el nombre de usuario usando expresiones regulares * El inicio de sesión debe tener al menos 4, no más de 16 caracteres * Debe contener caracteres latinos, números, * puede ser caracteres "_", "-", "." * / $ patrón = "/ ^ [-_. az \ d] (4,16) $ / i"; $ resultado = preg_match ($ patrón, $ str) ; // Si la verificación falla, devuelve un mensaje de error if (! $ Result) ($ error = "Caracteres no válidos en el nombre de usuario o el nombre de usuario es demasiado corto (largo)"; return $ error;) // Si todo está bien , return true return true;) // Verifica la función de contraseña del usuario checkPassword ($ str) (// Inicializa la variable con un posible mensaje de error $ error = ""; // Si no hay aparece una cadena con un inicio de sesión, devuelve un mensaje de error si (! $ str) ($ error = "No ingresó una contraseña"; return $ error; ) / ** * Verifique la contraseña del usuario usando expresiones regulares * La contraseña no debe ser menor de 6, ni mayor de 16 caracteres * Debe contener caracteres latinos, números, * puede contener caracteres "_", "!", "( ",") "* / $ patrón =" / ^ [_!) (. az \ d * (6,16) $ / i "; $ resultado = preg_match ($ patrón, $ str); // Si el cheque falló, devuelve un mensaje de error si (! $ resultado) ($ error = "Caracteres no válidos en la contraseña del usuario o la contraseña es demasiado corta (larga)"; devuelve $ error;) // Si todo está bien, devuelve verdadero devuelve verdadero ;)

Ahora necesitamos modificar el archivo registration.php para usar las funciones que hemos declarado. Agregaremos una condición al script para verificar que se haga clic en el botón de registro. Dentro de esta condición, se inicia una verificación del inicio de sesión y las contraseñas. Si alguna de las comprobaciones falla, volvemos a renderizar el formulario y mostramos un mensaje de error. Si no hay errores, registramos al usuario, ya no mostramos el formulario de registro, informamos al usuario sobre el registro exitoso y, utilizando la función header (), lo redireccionamos al formulario de autorización.

Te has registrado con éxito en el sistema. Ahora será redirigido a la página de inicio de sesión. Si esto no sucedió, acceda a él mediante un enlace directo.

"; header (" Refresh: 5; URL = login.php ");) // De lo contrario, informe al usuario sobre el error else ($ errors [" full_error "] = $ reg;)))?> Registro de usuario
" />
El nombre de usuario solo puede contener caracteres latinos, números, símbolos "_", "-", ".". La longitud del nombre de usuario debe tener al menos 4 caracteres y no más de 16 caracteres
En la contraseña, puede usar solo caracteres latinos, números, símbolos "_", "!", "(", ")". La contraseña debe tener al menos 6 caracteres y no más de 16 caracteres
Repita la contraseña ingresada previamente


Debería haber notado otra función nueva en el script: registro (). Y aún no lo hemos anunciado. Vamos a hacer eso.

// Función de registro de usuario registro de función ($ inicio de sesión, $ contraseña) (// Inicializar una variable con un posible mensaje de error $ error = ""; // Si no hay una cadena de inicio de sesión, devolver un mensaje de error si (! $ Iniciar sesión) ($ error = "Inicio de sesión no especificado"; return $ error;) elseif (! $ contraseña) ($ error = "Contraseña no especificada"; return $ error;) // Compruebe si el usuario ya está registrado // Conéctese al DBMS connect (); // Escribe una cadena de consulta $ sql = "SELECT` id` FROM` users` WHERE` login` = "". $ Login. "" "; // Haz una consulta a la base de datos $ query = mysql_query ($ sql) or die (""); // Mira el número de usuarios con este inicio de sesión, si hay al menos uno, // devuelve un mensaje de error if (mysql_num_rows ($ query)> 0) ($ error = "Un usuario con el inicio de sesión especificado ya está registrado"; return $ error;) // Si no existe tal usuario, regístrelo // Escriba una cadena de consulta $ sql = "INSERT INTO` users` (` id`, `login `,` contraseña`) VALORES (NULL, "". $ login. " "," ". $ contraseña. "") "; // Realizar una consulta a la base de datos $ query = mysql_query ($ sql) o morir ("

No se puede agregar el usuario: ". Mysql_error ().". Se produjo un error en la línea ". __LINE__".

"); // No olvides desconectarte del DBMS mysql_close (); // Devuelve el valor true, indicando el registro exitoso del usuario return true;)

Si todo está bien, su usuario quedará registrado. Puede probar el formulario. Intente registrar usuarios con los mismos inicios de sesión. Después del registro exitoso, el usuario será redirigido al formulario de autorización. Anteriormente, acabamos de crear el marcado para mostrar este formulario. Dado que no hay ningún parámetro especificado en su atributo de acción, los datos enviados por el formulario se procesarán en el mismo script. Por lo tanto, debemos escribir el código para procesarlo y agregarlo al documento login.php.

Autorización de usuario

;">

Si no está registrado en el sistema, regístrese.



Probablemente haya notado que en el script de autorización tenemos otra función desconocida: autorización (). Esta función debe autorizar al usuario comprobando primero si hay un usuario registrado en la base de datos con el mismo nombre de usuario y contraseña. Si no se encuentra dicho usuario, la autorización se interrumpirá y se mostrará un mensaje de error en la pantalla. Si la verificación es exitosa, la función de autorización () iniciará una sesión y le escribirá los valores de nombre de usuario y contraseña, informará al script sobre el éxito de la autorización y el script redirigirá al usuario a la página de recursos protegidos.

/ ** * Función de autorización de usuario. * La autorización de los usuarios con nosotros se realizará * mediante sesiones PHP. * / autorización de función ($ inicio de sesión, $ contraseña) (// Inicializar una variable con un posible mensaje de error $ error = ""; // Si no hay una línea de inicio de sesión, devolver un mensaje de error si (! $ inicio de sesión) ($ error = "Inicio de sesión no especificado"; devuelve $ error;) elseif (! $ Contraseña) ($ error = "Contraseña no especificada"; devuelve $ error;) // Compruebe si el usuario ya está registrado // Conéctese al DBMS connect ( ); // Necesitamos verificar si hay un usuario entre los registrados // Redactar una cadena de consulta $ sql = "SELECT` id` FROM` users` WHERE` login` = "". $ Login. "" Y `password` =" ". $ Password." ""; // Ejecuta la consulta $ query = mysql_query ($ sql) o muere ("

No se puede ejecutar la consulta: ". Mysql_error ().". Se produjo un error en la línea ". __LINE__".

"); // Si no hay ningún usuario con esos datos, devuelve un mensaje de error if (mysql_num_rows ($ consulta) == 0) ($ error =" El usuario con los datos especificados no está registrado "; devuelve $ error;) // Si el usuario existe, inicie la sesión session_start (); // Y escriba el nombre de usuario y la contraseña en él // Para esto usamos la matriz superglobal $ _SESSION $ _SESSION ["login"] = $ login; $ _SESSION [" contraseña "] = $ contraseña; / / No olvide cerrar la conexión de la base de datos mysql_close (); // Devolver verdadero para el mensaje sobre la autorización de usuario exitosa return verdadero;)

Cuando un usuario ingresa a una página protegida, debe verificar la exactitud de sus datos de autorización. Para ello, necesitamos una función personalizada más. Llamémoslo checkAuth (). Su tarea será la de contrastar los datos de autorización del usuario con los que se encuentran almacenados en nuestra base de datos. Si los datos no coinciden, el usuario será redirigido a la página de autorización.

Función checkAuth ($ inicio de sesión, $ contraseña) (// Si no hay nombre de usuario o contraseña, devuelva falso si (! $ Inicio de sesión ||! $ Contraseña) devuelva falso; // Compruebe si dicho usuario está registrado // Conéctese al DBMS connect (); // Cree una cadena de consulta $ sql = "SELECT` id` FROM` users` WHERE` login` = "". $ Login. "" AND `password` =" ". $ Password." "" ; // Ejecuta la consulta $ query = mysql_query ($ sql) o muere ("

No se puede ejecutar la consulta: ". Mysql_error ().". Se produjo un error en la línea ". __LINE__".

"); // Si no hay ningún usuario con esos datos, devuelve falso; if (mysql_num_rows ($ consulta) == 0) (devuelve falso;) // No olvide cerrar la conexión a la base de datos mysql_close (); // De lo contrario , devuelve verdadero devuelve verdadero;)

Ahora que el usuario está en la página segura, debemos llamar a la función de validación de datos de autorización. Colocaremos la llamada y el script de verificación en un archivo checkAuth.php separado y lo conectaremos a las páginas que se cerrarán para el acceso público.

/ ** * Script para verificar la autorización del usuario * / // Iniciar una sesión, de la cual extraeremos el nombre de usuario y la contraseña // de los usuarios registrados session_start (); // Incluir un archivo con funciones personalizadas require_once ("functions.php"); / ** * Para determinar si un usuario está conectado, necesitamos * verificar si hay registros en la base de datos para su nombre de usuario * y contraseña. Para hacer esto, usaremos la función personalizada * para verificar la exactitud de los datos de usuario registrados. * Si esta función devuelve falso, entonces no hay autorización. * En ausencia de autorización, simplemente redirigimos * al usuario a la página de autorización. * / // Si la sesión contiene datos de inicio de sesión y contraseña, // márquelos si (isset ($ _ SESSION ["inicio de sesión"]) && $ _SESSION ["inicio de sesión"] && isset ($ _ SESSION ["contraseña"] ) && $ _SESSION ["contraseña"]) (// Si falla la validación de los datos existentes if (! CheckAuth ($ _ SESSION ["login"], $ _SESSION ["contraseña"])) (// Redirigir al usuario al encabezado de la página de autorización ("location: login.php"); // Detener la ejecución del script exit;)) // Si no hay datos sobre el inicio de sesión o la contraseña del usuario, // pensamos que no hay autorización, redirigir el usuario // a la página de autorización else (header ("location: login.php"); // Abortar la salida del script;)

Ahora creemos el código para nuestra página segura. Será bastante sencillo.

Autorización y registro de usuarios

Autorización exitosa.

Ha accedido a una página segura. Puede cerrar sesión en el sistema.



Como puede ver, en el documento protegido incluimos solo un archivo: checkAuth.php. Todos los demás archivos se incluyen en otros scripts. Por lo tanto, nuestro código no parece engorroso. Organizamos el registro y autorización de usuarios. Ahora debe permitir que los usuarios cierren la sesión. Para hacer esto, crearemos un script en el archivo logout.php.

/ ** * Script de cierre de sesión del usuario. Dado que los usuarios están * autorizados a través de sesiones, su nombre de usuario y contraseña se almacenan * en la matriz supergloban $ _SESSION. Para salir del sistema, simplemente destruya los valores * de la matriz $ _SESSION ["login"] y $ _SESSION ["contraseña"], luego * de lo cual redirigimos al usuario a la página de autorización * / // Asegúrese para iniciar la sesión session_start (); unset ($ _ SESSION ["iniciar sesión"]); unset ($ _ SESSION ["contraseña"]); encabezado ("ubicación: login.php");

El script para el registro, la autorización y la verificación del usuario está listo. Puedes usarlo en casa, complementarlo, cambiarlo para que se adapte a tus necesidades. Si tiene alguna pregunta, puede hacerla en los comentarios. Puede descargar usted mismo todos los archivos mencionados aquí, empaquetados en un solo archivo.

PD Soy consciente de que es mejor escribir código orientado a objetos, sé que no vale la pena transmitir y almacenar la contraseña en texto claro, que la información ingresada en la base de datos debe ser verificada de antemano. Sé. No hablaré de esto aquí.

¡Hola! Ahora intentaremos implementar el registro más simple en el sitio usando PHP + MySQL. Para hacer esto, Apache debe estar instalado en su computadora. El principio de nuestro script se muestra a continuación.

1. Comencemos por crear la placa de los usuarios en la base de datos.... Contendrá datos de usuario (nombre de usuario y contraseña). Vayamos a phpmyadmin (si crea una base en su PC http: // localhost / phpmyadmin /). Crea una tabla usuarios, tendrá 3 campos.

Lo creo en la base de datos mysql, puedes crearlo en otra base de datos. A continuación, establezca los valores, como en la imagen:

2. Se requiere una conexión a esta tabla. Vamos a crear un archivo bd.php... Su contenido:

$ db = mysql_connect ("su servidor MySQL", "iniciar sesión en este servidor", "contraseña de este servidor");
mysql_select_db ("nombre de la base de datos a la que nos estamos conectando", $ db);
?>

En mi caso, se ve así:

$ db = mysql_connect ("localhost", "usuario", "1234");
mysql_select_db ("mysql", $ db);
?>

Nosotros salvamos bd.php.
¡Multa! Tenemos una tabla en la base de datos, una conexión a ella. Ahora puedes empezar a crear una página donde los usuarios dejarán sus datos.

3. Cree un archivo reg.php con contenido (todos los comentarios dentro):



registro


registro


















4. Crea un archivo, que ingresará datos en la base de datos y guardará al usuario. save_user.php(comentarios adentro):



{
}
// si se ingresan el nombre de usuario y la contraseña, los procesamos para que las etiquetas y los scripts no funcionen, nunca se sabe qué pueden ingresar las personas


// eliminar espacios extra
$ inicio de sesión = recorte ($ inicio de sesión);
$ contraseña = recortar ($ contraseña);
// conectarse a la base de datos
// verifica la existencia de un usuario con el mismo inicio de sesión
$ resultado = mysql_query ("SELECCIONAR ID DE usuarios DONDE login =" $ login "", $ db);
if (! empty ($ myrow ["id"])) (
exit ("Lo sentimos, el nombre de usuario que ingresó ya está registrado. Ingrese otro nombre de usuario");
}
// si no, guarda los datos
$ result2 = mysql_query ("INSERT INTO users (login, password) VALUES (" $ login "," $ password ")");
// Comprueba si hay algún error
si ($ resultado2 == "VERDADERO")
{
echo "¡Se ha registrado correctamente! Ahora puede entrar en el sitio. Página de inicio";
}
demás (
echo "¡Error! No estás registrado.";
}
?>

5. ¡Ahora nuestros usuarios pueden registrarse! A continuación, debe hacer una "puerta" para ingresar al sitio para los usuarios ya registrados. index.php(comentarios adentro):

// todo el procedimiento funciona en sesiones. Es en él donde se almacenan los datos del usuario mientras está en el sitio. ¡Es muy importante ejecutarlos al principio de la página!
session_start ();
?>


Página de inicio


Página de inicio











Regístrate ahora



// Compruebe si las variables de identificación de usuario y de inicio de sesión están vacías
if (vacío ($ _ SESSION ["iniciar sesión"]) o vacío ($ _ SESSION ["id"]))
{
// Si está vacío, entonces no mostramos el enlace
echo "Has iniciado sesión como invitado
Este enlace solo está disponible para usuarios registrados ";
}
demás
{

En archivo index.php mostraremos un enlace que estará abierto solo para usuarios registrados. Este es el objetivo del script: restringir el acceso a cualquier dato.

6. Existe un archivo con la verificación del nombre de usuario y contraseña ingresados. testreg.php (comentarios dentro):

session_start (); // todo el procedimiento funciona en sesiones. Es en él donde se almacenan los datos del usuario mientras está en el sitio. ¡Es muy importante ejecutarlos al principio de la página!
if (isset ($ _ POST ["login"])) ($ login = $ _POST ["login"]; if ($ login == "") (unset ($ login);)) // ingrese el inicio de sesión ingresado por el usuario en la variable $ login, si está vacía, destruimos la variable
if (isset ($ _ POST ["contraseña"])) ($ contraseña = $ _ POST ["contraseña"]; if ($ contraseña == "") (unset ($ contraseña);))
// coloca la contraseña ingresada por el usuario en la variable $ contraseña, si está vacía, luego destruye la variable
if (vacío ($ inicio de sesión) o vacío ($ contraseña)) // si el usuario no ingresó el nombre de usuario o contraseña, entonces emitimos un error y detenemos el script
{
salir ("¡No ingresó toda la información, regrese y complete todos los campos!");
}
// si se ingresan el nombre de usuario y la contraseña, los procesamos para que las etiquetas y los scripts no funcionen, nunca se sabe qué pueden ingresar las personas
$ login = stripslashes ($ login);
$ inicio de sesión = htmlspecialchars ($ inicio de sesión);
$ contraseña = stripslashes ($ contraseña);
$ contraseña = htmlspecialchars ($ contraseña);
// eliminar espacios extra
$ inicio de sesión = recorte ($ inicio de sesión);
$ contraseña = recortar ($ contraseña);
// conectarse a la base de datos
include ("bd.php"); // el archivo bd.php debe estar en la misma carpeta que todos los demás, si no lo está, simplemente cambie la ruta

$ resultado = mysql_query ("SELECCIONAR * DE los usuarios DONDE login =" $ login "", $ db); // recupera de la base de datos todos los datos sobre el usuario con el inicio de sesión ingresado
$ myrow = mysql_fetch_array ($ resultado);
if (vacío ($ myrow ["contraseña"]))
{
// si el usuario con el inicio de sesión ingresado no existe
}
demás (
// si existe, compruebe las contraseñas
if ($ myrow ["contraseña"] == $ contraseña) (
// si las contraseñas coinciden, ¡iniciamos una sesión para el usuario! ¡Puedes felicitarlo, entró!
$ _SESSION ["iniciar sesión"] = $ myrow ["iniciar sesión"];
$ _SESSION ["id"] = $ myrow ["id"]; // estos datos se utilizan con mucha frecuencia, por lo que el usuario que inició sesión "los llevará consigo"
echo "¡Has entrado con éxito en el sitio! Página de inicio";
}
demás (
// si las contraseñas no coinciden

Exit ("Lo sentimos, el inicio de sesión que ingresó o la contraseña es incorrecta.");
}
}
?>

¡Eso es todo! La lección puede resultar aburrida, pero muy útil. Aquí solo se muestra la idea de registro, luego puedes mejorarla: agregar protección, diseño, campos de datos, subir avatares, salir de la cuenta (para esto, simplemente destruye las variables de la sesión con la función desarmado) etc. ¡Buena suerte!

Revisé todo, ¡funciona correctamente!

Damas y caballeros,

¡O debería decir "Gentle Ladies" y "Hard Men" (tipos duros)!

Aquí está mi último (Código Nuevo) reg.php. Lo he modificado por:

  • Eliminando etiquetas de tira obsoletas, mysqli_escape_string.
  • Parámetros de entrada enlazados en el formulario de registro de usuario.
  • Se agregó el código htmlspecialcharacters en la salida para evitar la inyección de sql.

Mira lo desordenado que estaba mi código anterior antes de que muchos programadores aquí y otras fuentes me ayudaran (¡gracias a todos!).

Ok, mi nuevo código no tiene el código de confirmación por correo electrónico y muchos otros, pero los agregaré pronto. Los saqué aquí para hacer que el nuevo código sea simple para que pueda entenderlo fácilmente. Mantuvo solo los fundamentos en la primera impresión. Agregará las necesidades restantes en la segunda impresión.
Puede hacer sugerencias y criticar la codificación (pero no se moleste en mostrar un ejemplo de una mejora en el área que critica). ¿OK?

Código antiguo:

connect_error) (die ($ conn-> connect_error);) // Detalles del sitio. $ site_domain = "site-domain.com"; $ nombre_del_sitio = "nombre-del-sitio"; $ site_admin_email = "admin@site-domain.com"; // Realice la siguiente acción cuando el usuario se registre en el "botón Enviar". if (isset ($ _ POST ["enviar"])) (// Verifique si el usuario completó los campos "Nombre de usuario", "Contraseña" y "Correo electrónico" o no. De lo contrario, envíe una alerta para completarlos. if ( ! empty ($ _ POST ["member_registration_username"]) &&! empty ($ _ POST ["member_registration_password"]) &&! empty ($ _ POST ["member_registration_email"])) ($ member_registration_username = trim (strip_tags (strtolower (mysqli_real_escape $ _POST ["member_registration_username"])))); $ member_registration_password = trim (strip_tags (md5 (mysqli_real_escape_string ($ conn, $ _ POST ["member_registration_password"])))); // Compruebe si el nombre de usuario coincide en la tabla de usuarios. $ Sql = "SELECT * FROM users WHERE Usernames =" ". $ Member_registration_username." ""; $ Result = mysqli_query ($ conn, $ sql); // Si hay una coincidencia de nombre de usuario en la columna "Nombres de usuario", haga lo siguiente . .. if (mysqli_num_rows ($ result)! = 0) (// Dar alerta "username" ya tomado. $ _SESSION ["message"] = "¡Ese nombre de usuario $ member_registration_username ya está registrado!"; exit ();) / / Comprobar fo r Coincidencia de correo electrónico en la tabla de usuarios. $ sql = "SELECT * FROM users WHERE Emails =" ". $ member_registration_email." ""; $ resultado = mysqli_query ($ conexión, $ sql); // Si hay una coincidencia de nombre de usuario en la columna "Nombres de usuario", haga lo siguiente ... if (mysqli_num_rows ($ resultado)> 0) (// Proporcione el "correo electrónico" de alerta ya tomado. $ _SESSION ["mensaje"] = "¡Ese correo electrónico $ member_registration_email ya está registrado!"; Exit ();) // Volcar el nuevo "Nombre de usuario", "Correo electrónico" y "Contraseña" en la tabla "usuarios". $ sql = "INSERT INTO users (Usernames, Passwords, Emails) VALUES (" ". $ member_registration_username." "," ". $ member_registration_password." "," ". $ member_registration_email." ")"; if ($ sql) (// Dar la alerta volcando los detalles del nuevo usuario en la base de datos un éxito. $ _SESSION ["mensaje"] = "¡Inserción de datos en la tabla exitosa!";) else (// Dar la alerta volcando los detalles del nuevo usuario en la base de datos a falla. $ _SESSION ["mensaje"] = "¡Inserción de datos en la tabla falla!";)) else (// Dar alerta para completar todos los campos. $ _SESSION ["mensaje"] = "Debe completar todas las entradas campos! ";))?> <?php $site_name ?>Página de registro

Formulario de registro



Nuevo código:

prepare ("INSERT INTO tbl_users (nombre, contraseña) VALUES (?,?)")) (// Vincular las variables al parámetro como cadenas. $ stmt-> bind_param ("ss", $ nombre, $ contraseña); / / Ejecutar la sentencia. $ Stmt-> execute (); // Cerrar la sentencia preparada. $ Stmt-> close ();)) else (// Dar alerta para completar todos los campos. Echo "Debe completar todos los campos de entrada! ";))?> <?php $site_name ?>Página de registro

Formulario de registro



Compañeros programadores, mirando mi segundo código, creen:

  • es mejor;
  • libre de desorden;
  • más comprensible;
  • inyección sql gratis.

Y, en mi segundo código, ¿hay alguna posibilidad de que pueda ayudarme a convertir el comando INSERT sql (línea 45-55) al estilo mysqli de pdo?
Obtuve ese código pdo de:
wikihow.com

Cómo prevenir la inyección de SQL en PHP

La inyección de SQL es una de las vulnerabilidades más comunes en las aplicaciones en la web en la actualidad. Este artículo le mostrará cómo prevenir al 100% la inyección de SQL en su sitio web utilizando Prepared Statements en PHP. La inyección SQL es un tipo de ...

Dado que la mayor parte de mi código, en mi secuencia de comandos de muchas páginas, está en mysqli o estilo procedural, se verá extraño si 10 líneas son de estilo pdo o oop.
Sí, lo sé, lo sé, debería hacerlo en estilo pdo y oop, pero todavía soy un principiante y la mayoría de los tutoriales sobre php básico están en mysqli y estilo procedimental, por lo que no puedo cambiar a pdo y oop por el momento. Déjame aprenderé a caminar primero y luego saltaré como un canguro. Todavía soy un niño pequeño. Tengo que tomar las cosas paso a paso o me confundiré y me desanimaré con php.

Pregunta: En mi primer (código antiguo), verá que no uso el "eco" sino el "Mensaje de sesión" en su lugar, como mostraron 2 tutoriales de YouTube para hacerlo de esa manera sin dar ninguna explicación por qué. Por lo tanto, pregunto:

  1. ¿Cuál es la diferencia y los beneficios (pros) así como los contras entre el eco y el mensaje de sesión?
  2. ¿Cuándo debo usar cuál de ellos?


© 2021 skypenguin.ru - Consejos para cuidar mascotas