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 = "
" . $ mensaje . " |
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 = "
" . $ mensaje . " |
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"); ($_POST [ "Visto antes" ] == 1 && $_POST [ "OldAuth" ] == $_SERVER [ "PHP_AUTH_USER" ])) (
"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( "
"
;
encabezamiento( Bienvenido: ". htmlspecialchars($_SERVER["PHP_AUTH_USER"]) . "
encabezamiento( ";
encabezamiento( ""Inicio de sesión anterior: ";
encabezamiento( ". htmlspecialchars($_REQUEST["OldAuth"]);
encabezamiento( ""Inicio de sesión anterior: ";
. htmlspecialchars($_SERVER["PHP_AUTH_USER"]) . "\" />\n" ;
}
?>
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:
- Protección por contraseña (nombre de usuario/contraseña) mediante variables $_SERVER["PHP_AUTH_USER"] Y $_SERVER["PHP_AUTH_PW"].
- Protección por IP dirección del cliente usando una variable $_SERVER["REMOTE_ADDR"].
- 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.