Autenticación impávida php. HTTP Instalación de protección en una página usando MySQL y PHP. Ejemplo #7 Ejemplo de autenticación HTTP resumida

Aprenderemos cómo realizar una autenticación de usuario simple en el sitio. El sitio puede tener páginas solo para usuarios autorizados, y funcionarán completamente si les agregamos nuestro bloque de autenticación. Para crearlo, necesita una base de datos MySQL. Puede tener 5 columnas (mínimo), o más si desea agregar información sobre los usuarios. Llamemos a la base de datos "Userauth".

Creemos los siguientes campos en él: ID para contar el número de usuarios, UID para el número de identificación único del usuario, Nombre de usuario para el nombre del usuario, Correo electrónico para su dirección de correo electrónico y Contraseña para la contraseña. Puede utilizar su base de datos existente para autorizar al usuario, simplemente, como en el caso de una nueva base de datos, cree la siguiente tabla en ella.

código mysql

CREAR TABLA `usuarios` (`ID` int (11) NOT NULL AUTO_INCREMENT, `UID` int (11) NOT NULL, texto `Nombre de usuario` NOT NULL, texto `Email` NOT NULL, texto `Contraseña` NOT NULL, CLAVE PRIMARIA (`ID`)) MOTOR=MyISAM CONJUNTO DE CARACTERES PREDETERMINADO=utf8 AUTO_INCREMENT=1;

Ahora creemos el archivo "sql.php". Es el responsable de conectarse a la base de datos. Este código, en primer lugar, crea variables para el servidor y el usuario cuando se conecta al servidor. En segundo lugar seleccionará la base de datos, en este caso "USERAUTH". Este archivo debe estar incluido en "log.php" y "reg.php" para acceder a la base de datos.

código PHP

//Tu nombre de usuario MySQL$pasar = "redere"; //contraseña $conn = mysql_connect ($servidor, $usuario, $contraseña); //conexión al servidor$db = mysql_select_db("userauth", $conn); //selecciona base de datos si (!$db) ( //si no puede seleccionar una base de datos echo "Lo siento, error:(/>"; //Muestra mensaje de error salida(); //Permite ejecutar otros scripts PHP } ?>

La siguiente es la página de inicio de sesión, que se llamará "login.php". Primero, verifica los datos ingresados ​​en busca de errores. La página tiene campos para nombre de usuario, contraseña, botón de envío y enlace de registro. Cuando el usuario hace clic en el botón "Iniciar sesión", el formulario será procesado por el código del archivo "log.php" y luego iniciará sesión.

código PHP

0) { //si hay errores de sesión$error = "

"; //Iniciar una tabla para cada ($_SESSION["ERRMSG"] como $msg) ( //reconoce cada error$error .= " "; //escribirlo en una variable) $err .= "
" . $ mensaje . "
"; //cerrando la mesa desarmado ($_SESSION["ERRMSG"]); //eliminando una sesión } ?> Formulario de inicio de sesión
Nombre de usuario
Contraseña
Registro


Luego escribimos un script para iniciar sesión en el sistema. Llamémoslo "log.php". Tiene una función para limpiar los datos de entrada de inyecciones SQL que pueden arruinar su script. En segundo lugar, recibe los datos del formulario y comprueba que sean correctos. Si los datos de entrada son correctos, el script envía al usuario a la página de usuarios autorizados; de lo contrario, establece errores y envía al usuario a la página de inicio de sesión.

código PHP

//iniciar sesión de grabación función Fix($str) ( //limpieza de campos $str = trim($str); if (get_magic_quotes_gpc()) ( $str = stripslashes ($str); ) //matriz para almacenar errores$errflag = falso; //marca de error $nombre de usuario = Fix($_POST["nombre de usuario"]); //nombre de usuario$contraseña = Fix($_POST["contraseña"]);//contraseña) //verificación de contraseña if ($contraseña == "") ( $errmsg = "Falta la contraseña"; //error $errflag = true; //levanta la bandera en caso de error) //si se genera el indicador de error, redirige de nuevo al formulario de registro // registra errores sesión_write_close(); //cerrando la sesión //redireccionamiento salida(); ) //consulta a la base de datos$qry = "SELECCIONAR * DE `usuarios` DONDE `Nombre de usuario` = "$nombre de usuario" Y `Contraseña` = "" . md5 ($contraseña) . """; $resultado = mysql_query($qry);//comprobar si la solicitud fue exitosa (si hay datos en ella) if (mysql_num_rows ($resultado) == 1) ( while ($fila = mysql_fetch_assoc ($resultado)) ( $_SESSION["UID"] = $fila["UID"];//obteniendo el UID de la base de datos y colocándolo en la sesión $_SESSION["USERNAME"] = $nombre de usuario; sesión_write_close(); //cerrando la sesión//establece si el nombre de usuario coincide con el de la sesión //redireccionamiento encabezado("ubicación: miembro.php"); //cerrando la sesión) ) else ( $_SESSION["ERRMSG"] = "Nombre de usuario o contraseña no válidos"; //error session_write_close(); //redireccionamiento encabezado("ubicación: login.php");

salida(); ) ?>

código PHP

0) { //si hay errores de sesión$error = "

Hagamos una página de registro, llamémosla "register.php". Es similar a la página de inicio de sesión, solo que tiene algunos campos más y, en lugar de un enlace de registro, hay un enlace a login.php en caso de que el usuario ya tenga una cuenta. "; //comienzo de la tabla foreach ($_SESSION["ERRMSG"] como $msg) ($error .= " "; //establece cada error) $err .= "
" . $ mensaje . "
//los escribe en una variable "; //fin de la tabla no establecido ($_SESSION["ERRMSG"]); } ?> //destruye la sesión
Nombre de usuario
Formulario de inscripción
Contraseña
Correo electrónico
Registro


Ahora crearemos un script de registro en el archivo "reg.php". Incluirá "sql.php" para conectarse a la base de datos. Se utiliza la misma función que en el script de inicio de sesión para borrar el campo de entrada. Se establecen variables para posibles errores. Lo siguiente es una función para crear un identificador único que nunca antes se había proporcionado. Luego se extraen y verifican los datos del formulario de registro. Se realiza una verificación para garantizar que la dirección de correo electrónico tenga el formato correcto y que la contraseña se haya vuelto a ingresar correctamente. Luego, el script verifica si hay un usuario con el mismo nombre en la base de datos y, de ser así, informa un error. Finalmente, el código agrega al usuario a la base de datos.

código PHP

//iniciar sesión de grabación función Fix($str) ( //borrar campos $str = @trim($str); if (get_magic_quotes_gpc()) ( $str = stripslashes ($str); ) devolver mysql_real_escape_string($cadena); ) $errormsg = matriz();//matriz para almacenar errores //nombre de usuario$errflag = falso; //indicador de error $UID = "12323543534523453451465685454";//ID único $nombre de usuario = Fix($_POST["nombre de usuario"]); $correo electrónico = $_POST["correo electrónico"]; //correo electrónico $contraseña = Fix($_POST["contraseña"]);//contraseña $rcontraseña = Fix($_POST["rcontraseña"]);//repetir contraseña//verificar nombre de usuario if ($nombre de usuario == "") ( $errmsg = "Falta el nombre de usuario"; //error $errflag = true;//levanta la bandera en caso de error ) //comprueba el correo electrónico if(!eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@+(\.+)*(\.(2,3 ))$", $correo electrónico)) ( //debe coincidir con el formato:[correo electrónico protegido] if ($nombre de usuario == "") ( $errmsg = "Falta el nombre de usuario"; //error $errflag = true; } //verificación de contraseña$errmsg = "Correo electrónico no válido"; //error $errflag = verdadero; if ($nombre de usuario == "") ( $errmsg = "Falta el nombre de usuario"; //error $errflag = true; } if ($contraseña == "") ( $errmsg = "Falta la contraseña"; //error $errflag = true;//comprobación de repetición de contraseña if ($nombre de usuario == "") ( $errmsg = "Falta el nombre de usuario"; //error $errflag = true; } if ($rpassword == "") ( $errmsg = "Falta contraseña repetida";//error $errflag = true;//comprueba la validez de la contraseña if ($nombre de usuario == "") ( $errmsg = "Falta el nombre de usuario"; //error $errflag = true; } if (strcmp($contraseña, $rcontraseña) != 0) ( $errmsg = "Las contraseñas no coinciden";//error $errflag = true;//comprueba si el nombre de usuario está disponible if ($nombre de usuario! = "") ( $qry = "SELECT * FROM `usuarios` WHERE `Nombre de usuario` = "$nombre de usuario""; //consulta a MySQL $resultado = mysql_query ($qry); if ($resultado) ( si (mysql_num_rows ($resultado) > 0) (//si el nombre ya está en uso $errmsg = "Nombre de usuario ya en uso";//mensaje de error if ($nombre de usuario == "") ( $errmsg = "Falta el nombre de usuario"; //error $errflag = true;$errflag = verdadero; ) mysql_free_result($resultado);) ) $errmsg = "Nombre de usuario ya en uso"; sesión_write_close(); //cerrando la sesión//si los datos no están validados, redirige nuevamente al formulario de registro //redireccionamiento salida(); ) if ($errflag) ( $_SESSION["ERRMSG"] = $errmsg;$qry = "INSERTAR EN `userauth`.`users`(`UID`, `nombre de usuario`, `correo electrónico`, `contraseña`) VALUES("$UID","$nombre de usuario","$correo electrónico","" . md5 ($contraseña) """); $resultado = mysql_query($qry);//comprobar si la solicitud de adición fue exitosa if ($resultado) ( echo "Gracias por registrarse, " .$nombre de usuario ". Inicie sesión aquí

"; salir (); ) else ( morir ("Error, volver a consultar más tarde"); ) ?>

código PHP

También necesita crear una secuencia de comandos para cerrar la sesión del usuario del sistema. Finaliza la sesión del usuario con el ID y el nombre únicos proporcionados y luego redirige al usuario a la página de inicio de sesión.

código PHP

Finalmente, el script "auth.php" se puede utilizar para hacer que las páginas sean accesibles sólo para usuarios autorizados. Comprueba los datos de inicio de sesión y, si son correctos, permite al usuario navegar por las páginas y, en caso contrario, le solicita que inicie sesión. Además, si alguien intenta hackear el sitio creando una de las sesiones, ésta será interrumpida, como en el caso general.

Una de las condiciones del código anterior es el tema de la pregunta en .

código PHP

El siguiente código debe insertarse en la página para usuarios autorizados; se llama, por ejemplo, "member.php", pero el suyo puede llamarse como desee. )

Estás autorizado a acceder a esta página. Cerrar sesión (

¡La autenticación de usuario está lista! Es posible utilizar la función. encabezamiento() para enviar un mensaje"Se requiere autenticación" Es posible utilizar la función..

navegador, obligándolo a mostrar una ventana para ingresar su nombre de usuario y contraseña.

Una vez que el usuario complete el nombre de usuario y la contraseña, se llamará nuevamente al enlace que contiene el script PHP con las variables predefinidas PHP_AUTH_USER, PHP_AUTH_PW y AUTH_TYPE configuradas para inicio de sesión, contraseña y tipo de autenticación respectivamente. Estas variables predefinidas se almacenan en las matrices $_SERVER y $HTTP_SERVER_VARS. Se admiten ambos tipos: "Básico" y "Resumen" (desde PHP 5.1.0). Ver función para más detalles

Un ejemplo de un fragmento de script que obliga al cliente a iniciar sesión para ver la página:
Ejemplo #6 Ejemplo de autenticación HTTP básica si (!isset($_SERVER [ "PHP_AUTH_USER" ])) ();

encabezamiento( "WWW-Authenticate: Reino básico="Mi reino""
eco
;
"Texto enviado cuando
si el usuario hizo clic en el botón Cancelar"
encabezamiento(
"

salida;

" ;
encabezamiento( "

) demás ( Hola ($_SERVER [ "PHP_AUTH_USER" ]).

" ;
}
?>

Has introducido tu contraseña

( $_SERVER [ "PHP_AUTH_PW" ]) .

Ejemplo #7 Ejemplo de autenticación HTTP resumida

Este es un ejemplo de implementación de un script de autenticación HTTP implícito simple.
$usuarios = array("admin" => "micontraseña", "invitado" => "invitado");

si (vacío($_SERVER [ "PHP_AUTH_DIGEST" ])) (
encabezado ("HTTP/1.1 401 no autorizado");
Ejemplo #6 Ejemplo de autenticación HTTP básica "WWW-Authenticate: ámbito de resumen="". $ reino.
"",qop="auth",nonce="" . uniqid(). "",opaco="" . md5 ($reino). """ );

Morir( "Texto enviado si el usuario hace clic en Cancelar");
}

// analiza la variable PHP_AUTH_DIGEST
if (!($datos = http_digest_parse ($_SERVER [ "PHP_AUTH_DIGEST" ])) ||
!isset($usuarios [ $datos [ "nombre de usuario" ]]))
morir( "¡Datos incorrectos!");

// generar la respuesta correcta
$A1 = md5 ($datos [ "nombre de usuario" ] . ":" . $reino . ":" . $usuarios [ $datos [ "nombre de usuario" ]]);
$A2 = md5($_SERVER["REQUEST_METHOD"]. ":" . $datos["uri" ]);
$valid_response = md5 ($A1 . ":" . $datos [ "nonce" ]. ":" . $datos [ "nc" ]. ":" . $datos [ "cnonce" ]. ":" . $datos ["qop"].

si ($datos [ "respuesta" ] != $respuesta_valida )
morir( "¡Datos incorrectos!");

// ok, el inicio de sesión y la contraseña son correctos
echo "Ha iniciado sesión como: ". $datos["nombre de usuario"];

// función de análisis del encabezado de autenticación http
función http_digest_parse ($txt)
{
// protección contra datos faltantes
$needed_parts = array("nonce" => 1, "nc" => 1, "cnonce" => 1, "qop" => 1, "nombre de usuario" => 1, "uri" => 1, "respuesta" => 1);
$datos = matriz();
$keys = implosionar ("|" , array_keys ($needed_parts ));

Preg_match_all ("@(". $claves. ")=(?:([\""])([^\2]+?)\2|([^\s,]+))@", $txt , $coincidencias , PREG_SET_ORDER );

Foreach ($coincide con $m) (
$datos [ $m [ 1 ]] = $m [ 3 ] ? $metro [ 3 ] : $metro [ 4 ];
unset($piezas_necesarias [ $m [ 1 ]]);
}

¿Devolver $ piezas_necesarias? falso: $datos;
}
?>

Comentario: Nota de compatibilidad

Tenga especial cuidado al especificar encabezados HTTP. Para garantizar la máxima compatibilidad con el mayor número de clientes diferentes, la palabra "Básico" debe escribirse con una "B" mayúscula, la región (reino) debe estar entre comillas dobles (¡no simples!) y debe preceder exactamente un espacio. el codigo 401 en el título HTTP/1.0 401. Los parámetros de autenticación deben estar separados por comas, como se muestra en el ejemplo de autenticación implícita anterior.

En lugar de simplemente mostrar las variables PHP_AUTH_USER y PHP_AUTH_PW en la pantalla, es posible que deba verificar que sean correctas. Para hacer esto, utilice una consulta de base de datos o busque un usuario en un archivo dbm.

Puede observar las características operativas del navegador Internet Explorer. Es muy exigente con los parámetros de los encabezados transmitidos. El truco del título WWW-autenticar HTTP/1.0 401 antes de enviar el estado

A partir de PHP 4.3.0, para evitar que alguien escriba un script que revele la contraseña de una página que usa autenticación externa, las variables PHP_AUTH no se configuran si la página usa autenticación externa y está configurada en modo seguro. Sin embargo, la variable REMOTE_USER se puede utilizar para autenticar a un usuario autenticado externamente.

Comentario: Por lo tanto, siempre puedes usar la variable $_SERVER["REMOTE_USER"].

Nota de configuración PHP utiliza indicación directiva Tipo de autenticación

para indicar si se utiliza autenticación externa o no.

Cabe señalar que todo lo anterior no impide el robo de contraseñas de páginas que requieren autorización por parte de alguien que controla páginas sin autorización ubicadas en el mismo servidor.

Tanto Netscape Navigator como Internet Explorer borran el caché de autenticación de la ventana actual para un dominio determinado cuando se reciben del servidor.

Esto se puede utilizar para obligar al usuario a cerrar sesión y volver a mostrar el cuadro de diálogo de nombre de usuario y contraseña. Algunos desarrolladores utilizan esto para limitar el tiempo de inicio de sesión o proporcionar un botón de cierre de sesión.
Ejemplo #6 Ejemplo de autenticación HTTP básica Ejemplo #8 Ejemplo de autenticación HTTP con entrada forzada de un nuevo par de inicio de sesión/contraseña);
función autenticar() (
encabezamiento( "WWW-Authenticate: Reino básico="Probar sistema de autenticación"";
"Texto enviado cuando
}

encabezado ("HTTP/1.0 401 no autorizado");
"Debe ingresar el nombre de usuario y la contraseña correctos para obtener acceso al recurso \n"
if (!isset($_SERVER [ "PHP_AUTH_USER" ]) ||
si el usuario hizo clic en el botón Cancelar"
encabezamiento( "

($_POST [ "Visto antes" ] == 1 && $_POST [ "OldAuth" ] == $_SERVER [ "PHP_AUTH_USER" ])) ( autenticar();
" ;
encabezamiento( Bienvenido: ". htmlspecialchars($_SERVER["PHP_AUTH_USER"]) . "
encabezamiento( "

"Inicio de sesión anterior: ";
encabezamiento( ""Inicio de sesión anterior: ";
encabezamiento( ". htmlspecialchars($_REQUEST["OldAuth"]);
encabezamiento( ""Inicio de sesión anterior: ";
. htmlspecialchars($_SERVER["PHP_AUTH_USER"]) . "\" />\n" ;

Inicia sesión nuevamente
}
?>

eco " \n" ; Este comportamiento no está regulado por normas. HTTP Básico-autenticación, por lo que no debes depender de ella. Prueba del navegador HTTP Básico Lince "_" demostró que

También se debe tener en cuenta que antes de PHP 4.3.3, la autenticación HTTP no funcionaba en servidores que ejecutaban Microsoft IIS si PHP estaba instalado como un módulo CGI, debido a algunas limitaciones de IIS. Para que funcione correctamente en PHP 4.3.3+, debe editar la configuración de IIS llamada " Seguridad del directorio". Haga clic en la inscripción " Editar"y configure la opción" Acceso anónimo", todos los demás campos deben permanecer sin marcar.

Otra limitación si estás usando IIS vía ISAPI y PHP 4: variables PHP_AUTH_* no están definidos, pero al mismo tiempo la variable está disponible HTTP_AUTHORIZACIÓN. Código de ejemplo que podrías usar: lista($usuario, $pw) = explotar(":", base64_decode(substr($_SERVER["HTTP_AUTHORIZATION"], 6)));

Comentario: Nota sobre IIS:
Para que la autenticación HTTP funcione correctamente en IIS, en la configuración de PHP la opción cgi.rfc2616_headers debe estar configurada en 0 (valor predeterminado).

Comentario:

En caso de que se utilice el modo seguro, el UID del script actual se agregará a reino-parte del encabezado Es muy exigente con los parámetros de los encabezados transmitidos. El truco del título.

En ocasiones es necesario cerrarlo desde el acceso exterior. PHP página si está creando un área cerrada del sitio. Esto podría ser información oculta para sus clientes o visitantes del sitio, algún tipo de interfaz administrativa para usted, etc. Puede crear cientos de tareas diferentes que requieren restricciones de acceso.

Puedes cerrar dicha página de varias formas complementarias:

  1. Protección por contraseña (nombre de usuario/contraseña) mediante variables $_SERVER["PHP_AUTH_USER"] Y $_SERVER["PHP_AUTH_PW"].
  2. Protección por IP dirección del cliente usando una variable $_SERVER["REMOTE_ADDR"].
  3. Protección por IMPERMEABLE dirección en redes locales (además de protección por IP).

Veamos primero el primer método, que es el principal. Le permite bloquear el acceso a la página utilizando su nombre de usuario y contraseña, de modo que sólo las personas que conocen el nombre de usuario y la contraseña pueden acceder. Además, se pueden dividir según este criterio y, en consecuencia, se puede proporcionar información diferente para cada uno. Implementado mediante la emisión de campos especiales en el encabezado del protocolo. HTTP. Creemos una función autenticación_envío():

" ,"

Error de autenticación

" ,"

Póngase en contacto con el administrador para obtener su nombre de usuario y contraseña.

" ,""; salir; ); ?>

Esta función informa al navegador que el acceso requiere autorización mediante un nombre de usuario y contraseña. Y también muestra una página en HTML para el usuario.

" ,"

¡Bienvenido!

" ,"

Ha iniciado sesión con el nombre de usuario ",$auth_user" y la contraseña ",$auth_pass".

" ,"

"; ?>

El código de verificación de inicio de sesión y contraseña no es demasiado complicado en este caso, ya que está implementado para una sola persona. La lógica de funcionamiento es sencilla si no hay variable. $_SERVER["PHP_AUTH_USER"] Y $_SERVER["PHP_AUTH_PW"] o sus valores no coinciden con los requeridos, luego llame a la función autenticación_envío(). No olvides que al final llama. salida, por lo que la ejecución del programa se detiene.

El siguiente nivel de protección se implementa mediante el filtrado. IP direcciones del cliente que se conecta. Por supuesto, en Internet, muchos proveedores emiten IP direcciones temporales y esta protección es inútil, pero si hablamos de redes locales corporativas, esta verificación proporcionará protección adicional.

¡¡¡Tu IP no fue encontrada!!!"; salir; ); ?>

Aquí en la fila $ permitido_ips indicado separado por espacios IP direcciones a las que se permite el acceso. A continuación obtenemos la matriz usando explotar() y buscar la dirección del cliente desde $_SERVER["REMOTE_ADDR"]. Usé la función para buscar. búsqueda_matriz(), ya que es poco probable que su código implementado en C funcione algo más rápido que lo que podemos escribir en PHP usando bucles para o para cada uno. Pero la velocidad no es lo principal aquí :)

Y el último paso de la protección es la verificación. IMPERMEABLE direcciones. Está clasificado como paranoico y debe usarse si accedes desde una red local y los datos que estás protegiendo son realmente muy importantes. Hasta ahora he implementado esta verificación solo en el sistema. linux, debido a la relativa simplicidad de implementación. Pero puedes intentar implementarlo para cualquier otra plataforma. Escribimos una función:

Como los usuarios de Linux ya han entendido, se basa en ARP tabla del sistema, a la que se puede acceder mediante un archivo /proc/net/arp. La función busca cadenas para el requerido IP dirección y lo devuelve IMPERMEABLE DIRECCIÓN:

Su IP=192.168.10.15 y MAC=00:04:31:E4:F8:37

en el sistema ventanas Quizás también haya algunas formas de conseguirlo. IMPERMEABLE más simple, pero de los que realmente funcionan, esta es la conclusión ARP tablas del sistema con el comando:

C:\WINDOWS\>arp -a Interfaz: 192.168.10.15 en Interfaz 0x1000003 Dirección IP Tipo de dirección física 192.168.10.1 00-50-22-b0-6a-aa dinámica 192.168.10.2 00-0f-38-68-e9- e8 dinámico 192.168.10.3 00-04-61-9e-26-09 dinámico 192.168.10.5 00-0f-38-6a-b1-18 dinámico

Puede implementar protección basada en esta dirección usted mismo si realmente la necesita :) Pero recuerde que si tiene equipos no administrados en su red sin la capacidad de vincularse IMPERMEABLE direcciones al puerto, es posible que esta protección no funcione, ya que todos sus datos de identificación utilizados para la protección (nombre de usuario, contraseña, dirección IP y MAC) pueden ser falsificados.



Introducción

Este es un tutorial diseñado para mostrarle los conceptos básicos para proteger sus páginas web mediante la autenticación HTTP. En lugar del método tradicional .htaccess (servidor Apache), usaremos MySQL para almacenar los datos de los usuarios y sus contraseñas. Intentaré explicar lo más posible lo que, en mi opinión, se requiere para que un principiante aprenda MySQL y PHP. En principio, basándose en este programa puedes utilizar cualquier DBMS (sistema de gestión de bases de datos). ¿Por qué es interesante este método? Bueno, por ejemplo, aunque solo sea porque si usa una base de datos, puede permitir fácilmente que solo un determinado grupo (persona) tenga ciertos derechos para acceder a tal o cual información. Si utiliza el método tradicional .htaccess Apache, debe agregar manualmente los usuarios y la contraseña en el archivo de contraseñas. Y la ventaja de este método, bueno... búscala tú mismo.

Software requerido:

· Plataforma *nix (Linux, Unix, *BSD) · PHP 3.0.x o PHP 4.x · MySQL (cualquier versión)

Paso número uno

Adelante, lo primero que debemos averiguar es si queremos permitir que los usuarios que están en nuestra base de datos accedan a la página especificada. ¿Y cómo vamos a hacer esto? (a mucha gente no le gusta mucho, pero hay que acostumbrarse a coger un papel antes de programar y anotar todos los requisitos que queremos sacar del programa, a la larga ahorrarás horas o quizá días para realizar cambios en el código (aprox.))

Compruebe si el usuario ya está autenticado.

En caso contrario envía un mensaje al navegador, con un mensaje y un formulario de acceso.

Si el usuario pulsa en el botón cancelar, no permitirle el acceso y redirigirlo a... 403: Acceso denegado, o mostrar (cookie J) un mensaje simple.

Si el usuario ha completado una combinación de nombre de usuario y contraseña, verifíquelos en la base de datos MySQL y asegúrese de que sean correctos, en caso afirmativo, permita el acceso.

Si no entiendes todo, no te preocupes, ¡quedará claro más tarde (o tal vez nunca)!

Paso dos: cree nuestra base de datos

Queremos que la base de datos almacene el nombre de usuario y la contraseña de nuestros usuarios. Los campos obligatorios se pueden agregar fácilmente a una base de datos existente, pero asumiremos por ahora que no está agregando a una base de datos existente sino que está creando una nueva. El siguiente código es una descripción de cómo hacer esto. Supuesto: si tiene Apache en su computadora, puede comenzar inmediatamente :)

mysql> crear miembros de la base de datos;
mysql> crear usuarios de tabla (
nombre de usuario varchar(25) NO NULO,
contraseña varchar(15) NO NULA,
clave principal (nombre de usuario),
nombre de usuario único (nombre de usuario)
);

Ahora tenemos una base de datos para almacenar usuarios, se supone que el nombre de usuario tiene hasta 25 caracteres y las contraseñas tienen hasta 15 caracteres. (si por alguna razón no le conviene, configúrelo como mejor le parezca) El nombre de usuario debe tener el valor "clave principal" y ser "único", ya que no queremos que 2 o más personas tengan el mismo nombre de usuario.

Tenga en cuenta que los nombres de usuario serán sensibles al siguiente caso: el usuario "Vasya" se identificará de manera diferente al usuario "vasya", en otras palabras, se distinguirán entre mayúsculas y minúsculas. Ahora agregaremos un usuario de prueba a MySQL para que podamos usar sus datos para las pruebas cuando creemos la página PHP.

mysql> otorgar selección en miembros.usuarios
a httpusuario@localhost
identificado por "Mi Contraseña";

Esto es para que cuando queramos consultar el usuario y contraseña de una persona registrada en nuestra base de datos, utilizaremos el usuario "httpuser" con la contraseña "MyPassword". Finalmente debemos agregar el usuario y contraseña de la persona a la que queremos permitirle el acceso.

mysql> insertar en el valor de los usuarios ("john_doe", "eod_nhoj");

Deliberadamente no cifré los datos en el programa, para que en caso de pérdida de la contraseña no tuviera que descifrarlos y simplificarlos al mínimo :)) Eso es todo, terminamos con MySQL, ahora pasemos ¡en!

Paso tres: escribe código PHP

Antes de comenzar, describiré brevemente lo que hará la paga.

01 02
Cuando llegue a una página segura, el servidor enviará una solicitud y mostrará una página para ingresar su nombre y contraseña. Si hace clic en el botón cancelar o ingresa datos incorrectos, el servidor le enviará (encabezado 401 no autorizado y denegará el acceso). Así es como el mensaje generalmente traduce la línea (encabezado 401 no autorizado y denegará el acceso). No lo explico, en mi opinión no hay mejor manera de decirlo!!! Si ingresa todo correctamente, resulta que simplemente obtendrá acceso (eso es lo que necesitaba ser probado). Ahora la parte divertida, este es el mismo código. Está escrito deliberadamente con números de línea, después del código (a continuación) se dan explicaciones para las líneas.
03 función acceso_denied() (
05 }
06
04 echo "401 No autorizado: La combinación de nombre de usuario/contraseña que ingresó no era válida.n";
07 función auth_headers ($título) (
08 Encabezado("WWW-Authenticate: Reino básico="$título"");
10 }
11
09 Encabezado("HTTP/1.0 401 No autorizado");
12 si(!isset($PHP_AUTH_USER)) (
14 acceso_denied();
15 salidas;
16 }
17 más (
18
19 $nombredehost = "localhost";
20 $nombre de usuario = "httpusuario";
21 $contraseña = "MiContraseña";
22 $base de datos = "miembros";
23
24 $query = "seleccione nombre de usuario, contraseña de usuarios donde nombre de usuario="$PHP_AUTH_USER" y contraseña="$PHP_AUTH_PW"";
25 $link = mysql_connect($localhost, $nombre de usuario, $contraseña) o die("No se puede conectar al servidor de la base de datos");
26
27 si (mysql_num_rows(mysql_db_query($base de datos, $consulta)) == 0) (
28 auth_headers("Mi página web protegida");
29 acceso_denied();
30 salidas;
31 }
32
33 mysql_close($enlace);
34 }
35 ?>

Ese es el truco, funciona, funciona, puedes usarlo donde quieras, cuando quieras y como quieras, cambiarlo, mejorarlo, si logras reducir el código a dos líneas manteniendo la funcionalidad del programa, entonces asegúrate de enviármelo!!!

En esta sección, exploraremos rápidamente cada línea para evitar acalorados intercambios de preguntas por adelantado en los comentarios de este artículo.

Línea 3:
Esta función mostrará un mensaje si un "usuario maligno" ingresa persistentemente datos incorrectos. Hice de esto una función porque la usamos dos veces y solo para acortar el código fuente.

Línea 7:
Como también usamos este encabezado dos veces, también lo convertí en una función.

Línea 8:
Pase un encabezado al navegador que obligará al usuario a ingresar su nombre de usuario y contraseña. La variable $title se mostrará en el cuadro de diálogo de inicio de sesión.

Línea 9:
En la primera solicitud, se muestra un encabezado; cuando se cancela nuevamente, se muestra un mensaje indicando que el acceso está denegado.

Línea 12:
$PHP_AUTH_USER es un bucle que muestra un mensaje que dice que la página está protegida y ¡lárgate!

Línea 19-23:
Esto es algo que nadie sabe excepto usted, es decir, los medios para conectarse a la base de datos, el nombre del host, los nombres de la base de datos, el nombre de usuario y la contraseña. (para conectarse a MySQL)

Línea 24:
Una consulta MySQL que devuelve nombres de usuario y contraseñas.

Línea 25:
¡Establezca una conexión con MySQL y muestre una maldición si no hay conexión! (Esto significa que tiene algún problema en las líneas 19-23, o que no hay MySQL en absoluto)

Línea 27:
Proceso $consulta. Si devuelve - 0, significa que se ingresó una combinación no válida.

Línea 33:
Desconecte la conexión a MySQL.

Recomendaría guardar el código PHP en un archivo llamado user_auth.php, user_auth.php3, o... (aquí está tu imaginación sobre este tema). Supongamos que guardaste este código en el archivo user_auth.php. Siempre que de repente queremos proteger nuestra página ultrasecreta en la red, simplemente incluimos este archivo. Lo único que me gustaría llamar tu atención es que, lógicamente, debes conectarlo en la parte superior de tu página PHP protegida, te aconsejo que escribas lo siguiente en la línea número 1 de tus páginas:

donde "user_auth.php" es el nombre del archivo en el que guardó el código.

Tu pregunta: no uso MySQL, ¿qué debo hacer?

Consulta con el administrador de tu servidor, si resulta ser amable, entonces te ayudará, para él son 5 minutos de trabajo, si el malvado no ayuda, entonces ve al foro relacionado con la base de datos que estás usando y gritando pidiendo ayuda! O si te consideras un programador normal, entonces... no necesitarás este código en absoluto, y crearás “sesiones”, cifrarás usando PGP y, en general, pervertirás como si estuvieras protegiendo amazon.com.

Este artículo está desactualizado.

Este artículo fue escrito para el servicio de alojamiento compartido, que quedó obsoleto a partir del 1 de junio de 2019.

El servicio de alojamiento actual se puede solicitar en nuestro sitio web.

Autorización HTTP usando PHP

Este artículo analiza la creación de una autorización HTTP usando PHP, que le permitirá cerrar cualquier sección del sitio, por ejemplo la parte administrativa.

Para la autenticación, HTTP proporciona un mecanismo de desafío-respuesta simple que puede ser utilizado por el servidor para desafiar una solicitud de un cliente y por el cliente para proporcionar información de autenticación. El esquema de autorización más común es el esquema de autenticación básica.

El esquema de autenticación "básico" se basa en el hecho de que el agente de usuario (navegador) debe autenticarse utilizando una identificación de usuario (nombre de usuario) y una contraseña para cada dominio protegido. El servidor aceptará la solicitud si puede verificar que el ID y la contraseña del usuario sean correctos para el área protegida determinada. En este esquema no se proporcionan parámetros de identificación adicionales.

Después de recibir una solicitud de autenticación, el servidor responde con un desafío similar al siguiente:

Autenticación WWW: Reino básico="Área restringida" HTTP/1.1 401 No autorizado

Aquí, "Área restringida" es una cadena asignada por el servidor que identifica el área protegida del URI solicitado (Request-URI). En términos simples, el nombre del área protegida.

A continuación, para obtener las credenciales de acceso, el agente de usuario (navegador) envía el ID de usuario (nombre de usuario) y la contraseña, separados por un solo carácter de dos puntos (":"), al servidor dentro de una cadena de credenciales codificada en base64:

Credenciales-básicas = cookie-básica "básica"

Aquí

  • cookie-básica: cadena codificada en base64 que contiene contraseña de usuario
  • contraseña de usuario: una cadena como "ID de usuario: contraseña"
  • ID de usuario: texto que no contiene caracteres ":"
  • contraseña - texto

Tenga en cuenta que tanto el nombre de usuario como la contraseña distinguen entre mayúsculas y minúsculas. Es decir, por ejemplo, Usuario y usuario son dos nombres de usuario diferentes.

Autorización HTTP y PHP

Es posible que ya haya utilizado el esquema de autorización Básico con PHP y sepa que la esencia del método es recibir las variables PHP_AUTH_USER y PHP_AUTH_PW del servidor web, que definen el nombre de usuario y la contraseña, respectivamente, y de alguna manera procesarlas dentro del script PHP. . Pero tenga en cuenta que este método sólo es efectivo cuando PHP funciona como un módulo de servidor web Apache. En nuestro hosting, PHP se ejecuta en modo CGI/FastCGI y el método descrito anteriormente no funcionará, ya que las variables PHP_AUTH_USER y PHP_AUTH_PW no se pasarán dentro del script.

Sin embargo, existe una manera de evitar esta limitación y pasar los valores de nombre de usuario y contraseña que el usuario ingresa dentro del script PHP. Para estos fines, se utilizan las herramientas mod_rewrite: el módulo del servidor web Apache. Las reglas que usaremos son las siguientes:

RewriteCond %(HTTP:Autorización) ^Básico.* RewriteRule (.*) index.php?autorización=%(HTTP:Autorización)

Al realizar una solicitud a través de HTTP al archivo sitename.ru/www/index.php, esta regla transferirá el contenido de un campo Autorización no vacío al parámetro de autorización como una solicitud GET. Si usamos PHP para ver el contenido de la variable $_GET["autorización"], veremos solo las credenciales básicas descritas anteriormente: una línea como:

Preg_match("/^Basic\s+(.*)$/i", $_GET["autorización"], $user_pass); list($usuario,$contraseña)=explode(":",base64_decode($usuario_contraseña));

De esta manera obtendremos dos variables: $usuario y $pass, que contienen el nombre de usuario y la contraseña, respectivamente. Ahora, como se mencionó anteriormente, solo es necesario procesarlos de alguna manera, por ejemplo, compararlos con variables similares de la base de datos o de un archivo con cuentas de usuario.

Conclusión

El método discutido en este artículo funcionará exitosamente no solo en nuestro hosting, sino también en cualquier lugar donde PHP se ejecute en modo CGI/FastCGI y se use Apache + mod_rewrite como servidor web.

Puede encontrar los textos fuente de los ejemplos prácticos en el Apéndice de este artículo.

Solicitud. Fuentes de guiones

Texto fuente del archivo .htaccess

RewriteEngine en RewriteBase / RewriteCond %(HTTP:Autorización) ^Basic.* RewriteRule (.*) index.php?authorization=%(HTTP:Autorización)

Texto fuente del script PHP

$autenticado=0; if(isset($_GET["autorización"])) ( if(preg_match("/^Basic\s+(.*)$/i", $_GET["autorización"], $user_pass)) ( list($usuario ,$pass)=explode(":",base64_decode($user_pass)); // Comprobando la exactitud de los detalles de acceso ingresados ​​if($user=="user" && $pass=="contraseña") ( $authenticated= 1; ) ) ) if($authenticated) ( // La autorización se completó correctamente echo("usuario: ".$usuario."
pasar: ".$pass); ) else ( encabezado("WWW-Authenticate: Reino básico="Área restringida""); encabezado("HTTP/1.1 401 no autorizado"); echo("Acceso denegado."); )


Arriba