Una parte crucial de la práctica de desarrollo de PHP es tener en cuenta que la seguridad no es algo que pueda comprar en su tienda local. Garantizar la seguridad de sus aplicaciones web es un proceso que, con el tiempo, debe ser evaluado, monitoreado y fortalecido constantemente.
Si bien el uso de filtros y datos de validación es una parte del proceso de seguridad, un desarrollador web debe ser consciente de que la aleatorización, la ofuscación y la criptografía en PHP pueden marcar la diferencia en la seguridad de las aplicaciones web. Este tutorial lo guiará a través de algunas técnicas simples para crear y usar valores aleatorios o únicos dentro de sus aplicaciones web, observar y aplicar algunas técnicas generales de ofuscación, y profundizar en la ciencia de la criptología y su uso dentro de PHP..
Dictionary.com define la aleatorización como:
"-verbio: para ordenar o seleccionar de manera aleatoria, como en una muestra o experimento, especialmente para reducir el sesgo y la interferencia causada por variables irrelevantes; hacer aleatorio".
La generación de números aleatorios se determina de varias maneras, sin embargo, los generadores computacionales no alcanzan la aleatoriedad "real" como se ve en la naturaleza o el ruido electrónico (el canal difuso, chirriante, blanco y negro en la TV). Estos valores calculados se consideran pseudoaleatorios..
PHP nos proporciona un par de formas diferentes para crear valores aleatorios. Veamos algunas de las funciones más populares..
Las dos funciones rand ()
y mt_rand ()
son probablemente las funciones más utilizadas para generar un conjunto de números aleatorios en PHP. La función rand ()
; es un generador más antiguo, y está fuera de uso debido a mt_rand ()
; que es más rápido, más confiable y puede manejar un valor entero máximo más alto en algunas plataformas. La función str_shuffle ()
hace exactamente lo que cabría esperar, baraja una cadena que se le pasa.
"; print mt_rand (0, 20); // Genera un entero aleatorio entre 0 y 20 echo"
"; // Ejemplos de uso de rand () imprimen rand (); // eco predeterminado"
"; print rand (0, 25); // Genera un entero aleatorio entre 0 y 25 ecos"
"; // Ejemplo de uso de str_shuffle $ string = 'abcefghijklmnopqrstuvwxyz'; print str_shuffle ($ string); // shuffles $ string?>
los rand ()
y mt_rand ()
Las dos funciones aceptan dos parámetros donde $ min
es el entero más bajo para empezar, y $ max
siendo el entero más grande para terminar con. La función str_shuffle
toma un parámetro, una cadena, generando una mutación aleatoria de la cadena. Actúa igual que si estuvieras barajando una baraja de cartas..
Mientras mt_rand ();
escupirá un entero aleatorio, y str_shuffle
Mezclará una cadena, una función ampliamente utilizada para crear valores únicos aleatorios es uniqid ()
. Esto genera un identificador único prefijado basado en la hora actual en microsegundos (a través de php.net). El uso de esta función es útil para crear tokens de sesión e incluso claves de formulario como se ve en Asegure sus formularios con claves de formulario.
"; print uniqid (" NETTUTS ", TRUE); // ¿Agregando un prefijo adicional y configurando more_entropy en TRUE?>
La función uniqid ()
acepta dos parámetros: el primero agrega un prefijo a los resultados, mientras que el segundo, si se establece en VERDADERO, agregará entropía adicional al final del valor devuelto.
Hay un millón de ejemplos en la web que generan contraseñas aleatorias, todos hacen un buen trabajo en ello. "Pero, ¿por qué" preguntas "¿necesitaría generar una contraseña aleatoria?" Bueno, la respuesta, sencillamente, es que no tiene que confiar en que el usuario final se proporcione con una contraseña menos segura al momento de comenzar. La generación de contraseñas aleatorias es muy útil en los registros de usuarios, o cuando un usuario realiza una solicitud porque ha olvidado su contraseña. Al hacer esto, se garantiza una contraseña segura al comienzo de la experiencia de los usuarios en su sitio web, o puede cortar líneas de código cuando un usuario necesita acceder nuevamente..
Veamos algunos ejemplos: Ejemplo 1
Este ejemplo mezcla una cadena con str_shuffle
y devolverá una cadena dentro de un rango contado. Entonces, si quisiera generar una contraseña de 8 caracteres, pasaría 8 a la función randompassword, o randompassword (8) de su código fuente..
Ejemplo 2
En comparación, el ejemplo uno toma una cadena estática y la mezcla, luego la devuelve, el ejemplo dos agrega un sabor más dinámico (mmm sabroso). En el ejemplo dos, la cadena que se está barajando ya no es estática, sino que cambia con cada generación. Si bien el primer ejemplo es ciertamente suficiente en la mayoría de los casos para generar una contraseña segura, el segundo ejemplo nos permite asegurarnos de que la longitud de la cadena y los caracteres cambiarán con el uso, disminuyendo en gran medida la posibilidad de una duplicación.
Hacer cumplir el uso de contraseñas seguras dentro de una aplicación web impedirá que los usuarios visiten o se registren en un sitio web. A menudo es un intercambio entre obtener el tráfico que desea y garantizar la seguridad de la aplicación. Le sugiero permitir a sus usuarios crear sus propias contraseñas al registrarse, o permitirles elegir entre los dos.
La creación de contraseñas es una forma efectiva de aumentar la seguridad de las cuentas de sus usuarios, incluso si un atacante obtiene acceso a su base de datos, si se hace correctamente. Se puede argumentar que, con acceso a la sal, un atacante aún puede obtener sus credenciales. Si bien esto es cierto, la aplicación de algunas técnicas de asignación aleatoria al almacenamiento de contraseñas hará que ese proceso sea extremadamente difícil, especialmente si el almacenamiento de información y contenido del usuario se divide en bases de datos separadas..
Nuevamente, esto cae bajo la medida de "no dependencia del usuario final para proveerse de seguridad simple". Los usuarios generalmente usan contraseñas que son fáciles de recordar, e incluso usan las mismas contraseñas en múltiples sitios web (¡¿Lo sé, verdad?). Las contraseñas fáciles de recordar son generalmente palabras que se encuentran en un diccionario y otros tipos de valores (por ejemplo, 12345, QWERTY). Como desarrolladores a menudo nos burlamos de esta práctica, pero no podemos negar que es así como son las cosas..
Para que una aplicación web utilice un salt en una contraseña, la aplicación tiene que almacenarla en algún lugar. No se recomienda usar la misma sal en toda la base de datos de contraseñas, sino generar una sal única por usuario. La generación de una sal para una base de datos completa en realidad disminuye la seguridad de la aplicación web en el sentido de que si un atacante logra descifrarla, todo el esquema se rompe o, si se pierde, inutiliza la base de datos. La creación de un sistema de registro de miembros de pleno derecho con todas las campanas y silbidos está fuera del alcance de este tutorial, sin embargo, crearemos un sistema simple para usar un ejemplo. Veamos cómo generar una sal y aplicar algunas técnicas de aleatorización:
Aquí está la tabla SQL que usaremos..
CREAR TABLA SI NO EXISTE 'usuarios' ('usr_id' int (11) NOT NULL AUTO_INCREMENT, 'usr_name' varchar (24) NOT NULL, 'usr_pass' varchar (32) NOT NULL, 'usr_email' varchar (255) NOT NULL, 'usr_salt' varchar (255) NOT NULL, CLAVE PRINCIPAL ('usr_id')) MOTOR = CARTA POR DEFECTO DE MyISAM = latin1;
Éxito'; else echo 'Fracaso
'; ?>
Repasemos el código PHP. Para mantener las cosas simples, incluimos nuestro archivo de configuración de base de datos. Siguiente PHP verifica si el formulario HTML ha sido enviado al verificar si el $ _POST
Las variables no están vacías. Si no están vacíos, el script procede a escapar de los datos del formulario publicado por el usuario, preparándolos para insertarlos en la base de datos. Entonces generamos una sal simple usando uniqid ()
y mt_rand ()
y almacenarlo en la variable $ salt_gen
. Para saltear nuestra contraseña combinamos la contraseña $, luego la sal. Siguiente paso, de una manera hash las variables combinadas con md5.
"¡Pero espera! ¡También agregaste el correo electrónico de los usuarios al frente de la contraseña y el combo de sal!" ¡Sip! Hice esto porque, si un atacante obtiene acceso a mi base de datos de alguna manera, y a la sal, la única forma en que el atacante sabrá con certeza que la dirección de correo electrónico se usa para el hashing de la contraseña es si tienen acceso a El código fuente. ¿Qué tan aleatorio y único es una dirección de correo electrónico??
Para rematar el resto del código PHP, insertamos nuestras variables en la tabla de la base de datos dentro de sus respectivos campos y le brindamos al usuario algunos comentarios sobre el éxito o el fracaso. Ahora en el resto del archivo de registro, el HTML
Aquí creamos un formulario HTML simple que recopilará un nombre de usuario, un correo electrónico y una contraseña de un usuario. Nada de lujo aqui.
Así que ahora tenemos un formulario de registro simple, que inserta un usuario en la base de datos junto con su contraseña con sal. Vamos a crear una página de inicio de sesión que nos permita recuperar información de la base de datos y autenticar al usuario. Primero el PHP:
Yippie, estamos autenticados.!'; else echo 'Oh no, no estamos autenticados.!
'; else else echo 'Oh no, no estamos en la base de datos!
'; ?>
Básicamente, lo que estamos haciendo en el archivo login.php es tomar las variables de formulario enviadas, tomar la fila de la tabla asociada con el nombre de usuario y reconstruir la contraseña a partir de los elementos en la base de datos con la que fue creada (correo electrónico, pase, salt) y repetirlos . A continuación, verificamos la base de datos nuevamente para ver si el nombre de usuario Y el valor de la contraseña se reinventa para encontrar una coincidencia, dando como resultado que el usuario sea exitoso o no. Finalmente aquí está el HTML:
Una definición simple pero compleja de ofuscación es (use la versión contenida en la fuente si desea ejecutar el código):
Como puede ver, este código no pretende ser distinguible. No hay nombres de variables distintas, no hay comentarios, no hay espacio, no hay sangría, no hay un orden distinto y todo está en una línea. Aunque no podemos distinguir el código, nuestras máquinas aún saben lo que es. Funciona. Esta única línea de caos simplemente dice: "La ofuscación es una técnica utilizada para complicar el código de tal manera que no sea comprensible". Sí, sé de los errores..
La ofuscación tiene sus pros y sus contras. Su propósito es disuadir a una persona de descubrir qué código está haciendo de un vistazo, o por un período de tiempo. Esto es una ventaja para las personas con poco o ningún conocimiento del lenguaje de programación. Sin embargo, cualquier persona que tenga un conocimiento básico de PHP puede difundir el código ofuscado anterior y descubrir qué está haciendo, podría llevarle algo de tiempo. Este es uno de los defectos de la ofuscación, no es una forma de cifrado, es solo un intento de ser críptico. La ofuscación también se agrega normalmente al tamaño del archivo. La mayor parte del tiempo, se encontrará con código ofuscado en software propio y malicioso..
Esta es una pregunta común. Existen principalmente dos formas de ofuscar su código. Primero, puedes hacerlo a mano. Escribir código ofuscado lleva mucho tiempo. El ejemplo utilizado en este artículo tardó un poco en escribir debido a las mismas razones por las que usas la ofuscación en primer lugar (falta de estructura, orden, etc.), esto incluso dio lugar a algunos errores menores que ni siquiera quería cazar. y arreglar La segunda forma en que puede ofuscar su código es comprando un software que lo haga por usted. Usar un programa para ofuscar el código es trivial y, por supuesto, cuesta mucho dinero todo el tiempo. Algún software que pretende ofuscar su código, en realidad lo cifra y / o lo codifica de tal manera que se basa en un protocolo de enlace para funcionar. A menudo, encontrará un software cuyo proveedor ni siquiera garantiza que su código funcionará cuando esté listo. Incluso en el ejemplo, he usado un simple Base64
Función para codificar la construcción de la salida del script..
Realmente depende de tu plan. En particular, si está buscando vender su script PHP (o cualquier otro software), necesita una licencia. Esta va a ser una de las defensas de primera línea para impedir que el público destinado al software haga lo que quiera. Un excelente ejemplo de licencia se puede ver en la Wiki de Envato Marketplace. Sin embargo, es posible que desee ofuscar parte o la totalidad de su código por cualquier motivo. Sin embargo, debido a las ofensas negativas, si realmente está preocupado por la seguridad de su código fuente, vale la pena buscar el cifrado..
Wikipedia.com define la criptografía como:
"La práctica y estudio del ocultamiento de la información".
La criptografía es un gran problema, ya sea que lo sepa o no. En casi todas las aplicaciones web implementadas actualmente, se está utilizando cierta criptografía (es decir, clientes de correo y sitios web). Como desarrolladores, debemos estar informados y ser conscientes de las aplicaciones prácticas de la criptografía en nuestro software. PHP nos proporciona algunas funciones muy fundamentales y prácticas que podemos utilizar para cifrar datos. En esta sección, me referiré principalmente a los algoritmos de hash de una vía, aunque tocaré ligeramente el cifrado basado en clave simétrica. Hay muchos más (es decir, esteganografía, clave asimétrica para nombrar un par).
La mayor parte del tiempo utilizamos el hashing unidireccional como una forma de almacenar de forma segura las contraseñas y verificar la integridad de los datos de los archivos. Mientras hacemos esto, para autenticar a los miembros de una aplicación web, el hash de los usuarios ingresó la contraseña y la comparamos con el hash almacenado de los usuarios. La misma técnica se aplica para verificar la integridad de los archivos..
SHA-1, 2 y 3
La familia SHA de algoritmos hash son actualmente los más populares, significativamente SHA-1. A pesar de que el algoritmo SHA-1 puede tener una debilidad, todavía se usa ampliamente.
"; echo $ hash2".
"; // Saldrá: 42d2f15c3f92d28d7d58776e5d81b800f662cc6c?>
En PHP, SHA-2 se llama en un aspecto diferente, y requiere PHP 5 mayor o igual a 5.1.2. SHA-2 es superior a SHA-1 y puede llamarse con diferentes tamaños de bits.
"; echo $ hash_sha384".
"; echo $ hash_sha512".
? "; / * Imprime repspectively: sha256: sha384 09074adc0d70e15b88494643e29c2836e1ab94a21989691dec594cb0bd742ebc: 8535470750df54a78701d4bfe0451f9799057a5bc101944a32480d2436e8b95440bce3bcab3f9ce107b0b92d9595ae32 sha512: c2e6dce873a71800b862791e56b480b976bb26cd3136c02da510c3905caa49b7b9e9260549976e1e741cc93e4569a611f2030d3b7104c6c6c2ff9e6c9bf0946a * />
La función hash es llamada por hash (algoritmo, cadena); En las versiones más nuevas de PHP, la función hash () se puede utilizar para llamar a cualquier algoritmo hash de una sola vía que admita PHP (es decir, md5, sha-1, haval, ghost). Si desea ver una lista de todos los algoritmos de hash registrados, puede utilizar:
= 5.1.2 print_r (hash_algos ()); ?>
SHA-3 todavía se está desarrollando y está considerando para la estandarización. El Instituto Nacional de Estándares y Tecnología lanzó una competencia para encontrar un buen candidato para actuar como el nuevo algoritmo hash seguro, y las inscripciones para la competencia se cerraron el 31 de octubre de 2008. Una entrada bastante popular llamada Skein, tiene un módulo PHP disponible. Puedes descargar (aunque tienes que compilarlo tú mismo). Skein es desarrollado por algunos grandes nombres que se encuentran dentro de la industria de la seguridad como Bruce Schneier, Niels Ferguson y Stefan Lucks, por nombrar algunos. El sitio web oficial de Skein se puede encontrar aquí.
Los métodos de cifrado de clave simétrica son aquellos en los que la seguridad del cifrado reside principalmente en una clave, que se comparte entre dos puntos, donde los datos se cifran y los datos se descifran. Un ejemplo muy bueno de cómo puede funcionar esto fue proporcionado por el tutorial de Christian Beikov "Creando una clase de cifrado con PHP".
Esencialmente, HMAC es como una mezcla de hashing unidireccional y cifrado basado en clave. La seguridad de HMAC se basa en el tamaño de clave utilizado y la fuerza de la función hash con la que se calcula. Puedes comparar un poco este método con las contraseñas de salazón.
";?>
Bueno, ¡qué viaje! La asignación aleatoria de valores, la generación de contraseñas aleatorias, la creación de sal, el almacenamiento y la autenticación de los usuarios, la ofuscación, la criptografía ... parecen mucho más. ¡Pero vale la pena! Es importante saber qué tipo de seguridad va a implementar en sus aplicaciones web y cómo protegerla. Aún más, es importante mantener una actitud inteligente hacia estas implementaciones y no pensar que la seguridad solo se implementa con algunos métodos, sino con una combinación de ellos, con un toque de creatividad..