Tenga en cuenta que este proyecto ya no se mantiene activamente.
Este proyecto comenzó como una simple tarea escolar para un curso de PHP al que asistía. Entonces necesitaba este tipo de sistema para un sitio web que estaba creando y decidí empezar a expandirlo. Una advertencia: este proyecto es/será muy obstinado, lo que significa que solo agregaré características que yo mismo encuentre útiles o lo suficientemente interesantes como para desarrollar.
password_hash()
de PHP para codificar y salar las contraseñas. Los nombres de usuario se guardan como texto sin formato.PASSWORD_DEFAULT
que al momento de escribir este artículo usa BCRYPT.También conocido como '¿Por qué hay tantos archivos?'
El panel de administración estará aquí. De manera similar a muchas otras aplicaciones web (como WordPress), se puede acceder fácilmente al panel de administración escribiendo [host]/admin .
Esta carpeta incluye dos archivos que se utilizan para configurar algunas opciones de configuración. Más información a continuación.
Sólo algunas ventajas de CSS para la interfaz de usuario.
El instalador automático reside aquí.
Esta carpeta tiene todos los archivos .js necesarios para que funcione la interfaz de usuario.
Esta carpeta incluye la columna vertebral del sistema. Tiene archivos .php para conectarse a la base de datos, iniciar y cerrar sesión, registrar/crear una nueva cuenta y modificar cuentas existentes. También hay scripts.js que tiene algunas ventajas generales de JavaScript para la interfaz de usuario. Debe insertar la información de su base de datos en credenciales.php; consulte la sección de configuración a continuación para obtener ayuda.
Deberías leer esto antes de usarlo. Aunque es solo una licencia normal del MIT.
Este archivo.
Esta es la página de administración de cuentas. Los usuarios pueden cambiar su nombre de usuario y contraseña aquí.
Este archivo está aquí sólo para la demostración. Los usuarios solo pueden acceder a esta página si han iniciado sesión. De lo contrario, serán redirigidos a la página de inicio de sesión.
Mi opinión sobre la creación de un formulario de inicio de sesión simple con Bootstrap. No dude en modificarlo para adaptarlo a sus necesidades.
Mi opinión sobre la creación de un formulario de registro simple con Bootstrap. No dude en modificarlo para adaptarlo a sus necesidades.
El instalador automático lo utiliza para eliminarse una vez completada la instalación.
Esta es la lista de las palabras en inglés más comunes. Lo utiliza el sugeridor de nombre de usuario. Puede reemplazar la lista con su propio archivo .txt. Cada palabra de la lista debe ir seguida de un salto de línea.
Tenga en cuenta que las opciones de configuración están sujetas a cambios. Vuelve a consultar con frecuencia.
Si revisa la carpeta /config, notará que hay dos archivos diferentes allí. ¿Qué da? El archivo de configuración principal es config.php . Incluye configuraciones que se aplican en el nivel del servidor. Deberías editar principalmente este archivo.
Si también está utilizando la interfaz de usuario que proporciono, entonces también puede/debe editar config.js. Allí puede administrar cómo se ven las cosas para el usuario promedio. Recuerde que estas configuraciones son solo del lado del cliente y no se aplican de ninguna manera, por lo que los usuarios pueden editarlas.
Nombre de la opción | Descripción | Valor predeterminado | Valores admitidos |
---|---|---|---|
$disableUserSelfRegistration | Evitar que los usuarios se registren | FALSO | Booleano |
$nombredeusuarioMinLength | Nombre de usuario más corto permitido | 3 | 1 -> |
$nombredeusuarioLongitudMax | Nombre de usuario más largo permitido | 30 | 1 -> |
$contraseñaMinLength | Longitud mínima de las contraseñas | 8 | 1 -> |
$nombredeusuarioRegExp | Todos los nombres de usuario deben coincidir con esta expresión regular. | cualquier expresión regular | |
$contraseñaRegExp | Todas las contraseñas deben coincidir con esta expresión regular. | cualquier expresión regular | |
$nuevoNivelAccesoCuenta | Útil para crear su primera cuenta de administrador | "usuario" | "usuario", "administrador" |
$mododepuración | Le permite deshabilitar la conexión dabase (solo para depuración) | "No" | "No" |
$debugAdminNombre de usuario | Le permite iniciar sesión mientras está en modo de depuración | "administración" | cualquier cuerda |
$debugAdminContraseña | Le permite iniciar sesión mientras está en modo de depuración | "" | cualquier cuerda |
$debugSkipInstall | Esto es sólo para fines de depuración. | FALSO | FALSO |
$tiempo de espera | Tiempo de inactividad (en segundos) necesario para cerrar la sesión del usuario | 900 | cualquier número entero |
$adminPanelTiempo de espera | Tiempo de inactividad necesario para cerrar la sesión del usuario en el panel de administración | 450 | cualquier número entero |
$mensajesdeerror | Muestra mensajes de error más detallados. ¡Podría filtrarse información confidencial! | por defecto | "predeterminado","detallado" |
$allowUsernameChange | ¿Debería el usuario poder cambiar su nombre de usuario? | verdadero | booleano |
$forceHTTPS | Redirige todas las conexiones que no son HTTPS a HTTPS y envía HSTS | FALSO | booleano |
En 2019, se considera un gran riesgo de seguridad no utilizar HTTPS cuando se trata de cualquier tipo de información confidencial (como contraseñas). Es por eso que se recomienda encarecidamente utilizar únicamente soluciones de alojamiento que lo admitan y cambiar esta opción a verdadera. Hoy en día incluso puedes obtener el certificado SSL completamente gratis de Let's Encrypt, por lo que no hay motivos para no usarlo. Sin embargo, en algunos entornos (mal configurados) SERVER["HTTPS"] superglobal no está definido incluso cuando de hecho se usa HTTPS. Eso da como resultado un bucle interminable de redirecciones. Yo mismo lo aprendí de la manera más difícil.
Nombre de la opción | Descripción | Valor predeterminado | Valores admitidos |
---|---|---|---|
desactivarUserSelfRegistration | Deshabilita cualquier elemento de la interfaz de usuario relacionado con el registro. | FALSO | verdadero, falso |
nombre de usuarioMinLength | Nombre de usuario más corto que acepta la interfaz de usuario | 3 | 1 -> |
nombre de usuarioMaxLength | Nombre de usuario más largo que acepta UI | 30 | 1 -> |
contraseñaMinLength | Contraseña más corta que acepta la interfaz de usuario | 8 | 1 -> |
nombre de usuarioReglas | Esta cadena se muestra si el nombre de usuario no coincide con la expresión regular | cualquier cuerda | |
contraseñaReglas | Esta cadena se muestra si la contraseña no coincide con la expresión regular | cualquier cuerda | |
enableNombre de usuarioSugerencias | Le permite deshabilitar o habilitar sugerencias de nombre de usuario | verdadero | booleano |
permitircambio de nombre de usuario | ¿Debería el usuario poder cambiar su nombre de usuario (solo UI)? | verdadero | booleano |
habilitar mensaje de inicio de sesión | Mostrar cualquier mensaje en la página de inicio de sesión | FALSO | Booleano |
iniciar sesiónMensaje | Defina el mensaje que se mostrará cuando enableLoginMessage sea verdadero | "" | cualquier cuerda |
Como se indicó anteriormente, necesitará una base de datos MySQL. La base de datos no requiere mucho espacio (a menos que tenga MUCHOS usuarios) y cualquier versión bastante reciente de MySQl debería funcionar. Puede configurar su base de datos y crear una cuenta de administrador manualmente, o puede usar mi instalador automático.
Durante el primer paso de la instalación, el instalador debe escribir un archivo en la unidad de su host. Si no tiene los permisos adecuados para eso, debe realizar la instalación manualmente. Consulte las instrucciones a continuación.
users
de tabla con cinco columnas: username
, password
, accessLevel
, lastLogin
y rememberMeToken
. Utilice un tipo de datos de cadena como CHAR. Personalmente me gusta usar VARCHAR. Para el lastLogin
recomiendo INT(11). También agregaría un campo de identificación de incremento automático como clave principal, pero eso no es estrictamente necesario.Si está utilizando VARCHAR u otro tipo de datos con una longitud máxima de cadena variable, la siguiente tabla le resultará útil.
Campo | Longitud requerida (mínima) |
---|---|
nombre de usuario | Igual que $usernameMaxLength en config.php |
contraseña | Recomiendo usar 255 para estar seguro (ya que el método de cifrado predeterminado de PHP puede cambiar) |
nivel de acceso | 5 |
ultimoIniciar sesión | 11 |
recuerdaMeToken | 255 |
No te preocupes, algo como esto debería cubrirte:
CREATE TABLE IF NOT EXISTS users (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
username VARCHAR ( 64 ) NOT NULL UNIQUE,
password VARCHAR ( 255 ) NOT NULL ,
accessLevel VARCHAR ( 10 ) NOT NULL ,
lastLogin INT ( 11 ),
rememberMeToken VARCHAR ( 255 )
);
Después de configurar la base de datos, deberá crear su primera cuenta de administrador. Hay dos formas de hacerlo:
admin
y una contraseña generada aleatoriamente. (Si siguió mi ejemplo de SQL anterior y estableció una restricción ÚNICA en el campo de nombre de usuario, entonces la cuenta no se creará si ya existe. No recibirá un mensaje de error) Después de haber creado la cuenta de administrador, debe eliminar (o cambie el nombre) de la carpeta /install. Finalmente, inicie sesión en la cuenta recién creada y cambie la contraseña usando la página de administración de cuentas.O
$newAccountAccessLevel
en config/config.php a "admin" y luego crear una nueva cuenta utilizando el formulario de registro normal. Debe eliminar la carpeta /install para poder acceder a la página de inicio de sesión. Recuerde cambiar el valor nuevamente a "usuario" después.¡IMPORTANTE! Le recuerdo nuevamente que DEBE eliminar la carpeta /install antes de usarla en un entorno de producción en vivo. De lo contrario, ¡cualquiera puede ver las credenciales de su base de datos!
Después de la configuración, puede crear nuevas cuentas (de administrador o normales) utilizando el panel de administración.
Esto significa que el instalador notó que la función random_bytes(int)
no existe o no funciona correctamente. Si está utilizando una versión de PHP anterior a 7.0, debe utilizar una biblioteca de terceros que implemente esa función. Para PHP 5.x recomiendo este.
El valor predeterminado de MySQL es 3306.
Esto sucede cuando el asistente no logra eliminarse. Esto suele deberse a algunos permisos restrictivos en el host. Solucione el problema eliminando manualmente la carpeta /install.
Consulte los consejos para la solución de problemas en las preguntas frecuentes generales a continuación.
El panel de administración se encuentra en una etapa muy temprana de desarrollo. Muchas cosas podrían estar rotas.
Se agregarán más en el futuro.
/administración
Lea config.php con más atención.
Eso significa que se produjo PDOException
al intentar conectarse a la base de datos. Puede activar mensajes de error más detallados en /config/config.php . Las causas más comunes son:
PDO_MYSQL
no están disponibles o no están configurados correctamente.PDO_MYSQL
. No, no es así y ha sido así demasiado tiempo, lo sé. Estoy planeando hacerlo pronto™. Actualización: ya está funcionando. Tenga en cuenta que solo recuerda el inicio de sesión durante 30 días (por razones de seguridad).
Sí, sé que implementar algo así siempre abre nuevos agujeros de seguridad. Sin embargo, no estoy obligando a los usuarios a usarlo ni nada por el estilo. Si el usuario no marca la casilla, no se crea ningún token de acceso, por lo que no hay riesgo de seguridad para ese usuario.
random_bytes()
criptográficamente segura. Ese token se guarda en la base de datos y se envían dos cookies al navegador. El valor de la primera cookie es el nombre de usuario del usuario como texto sin formato. La segunda galleta es mucho más importante. Su valor es el token creado.El principal problema es que si "el malo" de alguna manera puede obtener acceso al token del usuario, puede falsificar fácilmente una cookie e iniciar sesión como ese usuario. Hay dos formas para que el malo obtenga acceso al token del usuario: de alguna manera (por ejemplo, inyección SQL) obteniendolo de la base de datos o robando la cookie y/o su valor del usuario.
Lo considero un riesgo para la seguridad, ya que algunas personas tenderían a utilizar contraseñas demasiado simples o iguales. Sin embargo, podría permitir esto en versiones futuras mediante una opción de configuración.