Programando con Yii2 Seguridad

Si estás preguntando, "¿Qué es Yii?" revisa Introducción al marco Yii, que revisa los beneficios de Yii e incluye una descripción general de Yii 2.0.

En esta serie de Programación con Yii2, guío a los lectores en el uso del Marco de trabajo de Yii2 para PHP. Si planea compartir su aplicación con el público, la necesitará para estar seguro, y es mejor planificar esto desde el principio. Afortunadamente, comenzar con un marco como Yii hace que esto sea mucho más fácil de lo que sería. Como se indica en Características de Yii:

Yii está equipado con muchas medidas de seguridad para ayudar a evitar que sus aplicaciones web sufran ataques como la inyección de SQL, los scripts entre sitios (XSS), la falsificación de solicitudes entre sitios (CSRF) y la manipulación de cookies..

En este tutorial, lo guiaré a través de los conceptos básicos de seguridad dentro del marco de la aplicación Yii. Y, si está interesado, los futuros episodios trabajarán para asegurar la aplicación, Meeting Planner, que aparece en nuestra serie de inicio, a medida que se acerca la versión alfa.

Antes de comenzar, recuerde que trato de participar en las discusiones a continuación. Si tiene alguna pregunta o sugerencia sobre un tema, envíe un comentario a continuación o contácteme en Twitter @reifman. 

Nota: Si notó la brecha entre los episodios de la serie Programación Yii, es porque tenía que tener cirugía cerebral el año pasado. Gracias por su paciencia y apoyo, es bueno volver a escribir con regularidad y espero continuar con la cobertura de Yii2..

Los fundamentos de la seguridad con Yii

Si eres nuevo en la seguridad de las aplicaciones web, hay mucho que entender acerca de las ofertas de Yii. Haré todo lo posible para ofrecer una visión general basada en lo mejor de la documentación de Yii 2.0. El equipo de Yii divide la seguridad en siete áreas clave:

  1. Autenticación
  2. Autorización
  3. Trabajar con contraseñas
  4. Criptografía
  5. Vistas de seguridad
  6. Clientes Autenticos
  7. Mejores prácticas

Empecemos a bucear en estos uno por uno..

1. Autenticación

La presentación de Ilii Kacharov en Yii Framework Security ofrece algunas diapositivas útiles que resumen el objetivo de la autenticación (y el siguiente subtema, autorización). Esencialmente, aquí están las preguntas que estos temas deben responder:

  • Quien es el usuario?
  • Es el usuario quien dice ser?
  • ¿Está el usuario autorizado para acceder a un recurso??
  • ¿Está el usuario autorizado para realizar una acción??
  • ¿Está el usuario autorizado para realizar una acción en un recurso??

El modelo de usuario y la interfaz de identidad

La clase yii / web / User de Yii se integra con yii \ web \ IdentityInterface para administrar el estado de autenticación del usuario dentro de su aplicación. 

En noviembre pasado, escribí un tutorial sobre la plantilla de aplicación avanzada de Yii. Una de las ventajas de la plantilla avanzada es que proporciona integración pre-construida del modelo de Usuario con ActiveRecord y su base de datos. Así que su aplicación ofrece autenticación basada en la base de datos de inmediato..

El modelo de usuario le permite iniciar sesión y desconectar a los usuarios mediante programación:

  • login () establece la identidad especificada y recuerda el estado de autenticación en sesión y cookie.
  • logout () marca al usuario como invitado y borra la información relevante de la sesión y la cookie.
  • setIdentity (): cambia la identidad del usuario sin tocar la sesión o la cookie, lo mejor para la funcionalidad API.

La propiedad $ isGuest determina si el usuario actual ha iniciado sesión o no. Cuando el usuario cierra la sesión, es nulo, pero de lo contrario, devuelve una instancia de IdentityInterface.

Esencialmente, necesita una clase de usuario que extienda ActiveRecord e implemente métodos para soportar IdentityInterface, como esto:

 $ token]);  / ** * @return int | string ID de usuario actual * / public function getId () return $ this-> id;  / ** * @return string usuario actual clave de autenticación * / public function getAuthKey () return $ this-> auth_key;  / ** * @param string $ authKey * @return boolean si la clave de auth es válida para el usuario actual * / public function validateAuthKey ($ authKey) return $ this-> getAuthKey () === $ authKey; 

Además, antes de crear un usuario, la aplicación genera una cadena aleatoria como una clave de autorización. Esto se puede usar en correos electrónicos de "olvidó su contraseña" u otros enlaces de inicio de sesión basados ​​en correo electrónico:

clase El usuario extiende ActiveRecord implementa IdentityInterface ... public function antesSave ($ insert) if (parent :: beforeSave ($ insert)) if ($ this-> isNewRecord) $ this-> auth_key = \ Yii :: $ app- > security-> generateRandomString ();  devuelve true;  falso retorno; 

Autorización

Yii proporciona dos enfoques integrados para la autorización. La lista de control de acceso (ACL) más simple determina qué usuarios o procesos pueden realizar acciones en un recurso, y el control de acceso basado en roles (RBAC) más intensivo le ayuda a administrar el acceso mediante la definición de roles. En RBAC, solo los usuarios o las tareas del sistema con roles específicos pueden realizar acciones específicas.

Lista de control de acceso

La ACL a veces también se denomina filtro de control de acceso (ACF). Yii proporciona soporte de ACL dentro de yii \ filters \ AccessControl. Es ideal para aplicaciones que solo necesitan un control de acceso simple. Es lo que he usado hasta ahora en el Meeting Planner..

Este es un ejemplo del SiteController común que configura un comportamiento de acceso para filtrar el acceso a las acciones disponibles, a menudo páginas. En este caso, ACL actúa en el registro, el inicio de sesión y el cierre de sesión. los '?' indica que cualquier usuario puede acceder a las páginas de inicio de sesión y de registro, mientras que '@' indica que solo los usuarios registrados o autenticados pueden acceder. En el siguiente ejemplo, solo los usuarios que han iniciado sesión pueden cerrar sesión:

use yii \ web \ Controller; use yii \ filters \ AccessControl; la clase SiteController extiende el Controlador comportamientos de función pública () return ['access' => ['class' => AccessControl :: className (), 'only' => ['login', 'logout', 'signup'], 'rules' => [['allow' => true, 'actions' => ['login', 'signup'], 'roles' => ['?'],], ['allow' => true, 'actions' => ['logout'], 'roles' => ['@'],],],],;  //…

A medida que el controlador crece, cada nueva acción debe definirse dentro de las reglas de AccessControl. Y, a medida que su aplicación crece, cada controlador y todas sus acciones deben integrar el filtrado de ACL para la seguridad.

Control de acceso basado en roles

El control de acceso basado en roles (RBAC) proporciona un sistema de autenticación más robusto, pero también requiere mucho más diseño e implementación por adelantado.. 

Con RBAC, usted define la autenticación a través de roles que pueden ser heredados (o no), y aplica roles a los usuarios. También puede definir reglas para roles. Las implementaciones de RBAC pueden ser bastante complejas.

En la siguiente figura, los administradores pueden realizar cualquier tarea, y los autores pueden crear una publicación y actualizar sus propias publicaciones. Jane es una administradora para que pueda realizar las tareas de los administradores, y John es solo un autor:

Yii implementa lo que llama "un RBAC jerárquico general, siguiendo el modelo NIST RBAC". La funcionalidad RBAC es proporcionada por su componente de aplicación authManager.

No profundizaré demasiado con RBAC aquí, pero espero hacerlo en un futuro tutorial. Una vez más, depende de las diosas editoriales: hablar con ellas nunca es fácil:

a través de PopSugar

Básicamente, para implementar RBAC a fondo, debe:

  • Definir roles y permisos.
  • Establecer relaciones entre sus roles y permisos.
  • define cualquier regla que exista
  • asocia reglas a tus roles y permisos
  • y finalmente, asignar roles a los usuarios.

Puede ver el código requerido para habilitar los inicios de un sistema RBAC a continuación:

authManager; // agregar el permiso "createPost" $ createPost = $ auth-> createPermission ('createPost'); $ createPost-> description = 'Crear una publicación'; $ auth-> add ($ createPost); // agregar el permiso "updatePost" $ updatePost = $ auth-> createPermission ('updatePost'); $ updatePost-> description = 'Actualizar publicación'; $ auth-> add ($ updatePost); // agrega el rol de "autor" y otorga a este rol el permiso "createPost" $ author = $ auth-> createRole ('author'); $ auth-> add ($ autor); $ auth-> addChild ($ author, $ createPost); // agregue el rol "admin" y otorgue a este rol el permiso "updatePost" // así como los permisos del rol "autor" $ admin = $ auth-> createRole ('admin'); $ auth-> add ($ admin); $ auth-> addChild ($ admin, $ updatePost); $ auth-> addChild ($ admin, $ author); // Asignar roles a los usuarios. 1 y 2 son identificaciones devueltas por IdentityInterface :: getId () // generalmente implementadas en su modelo de usuario. $ auth-> assign ($ autor, 2); $ auth-> assign ($ admin, 1); 

Para implementar RBAC, debe estar preparado para escribir una gran cantidad de código por adelantado, o a medida que su aplicación crezca. Y, si lo hace, Yii administrará la autenticación de acuerdo con el marco de autenticación que defina. En otras palabras, el diseño y la codificación por adelantado proporcionan una autenticación sólida y detallada.

Trabajando Con Contraseñas

Como Mark Zuckerberg aprendió en junio, algunos sitios web almacenan las contraseñas de los usuarios en texto simple, pero las suyas no deberían; para ser justo con Zuckerberg, mi cuenta de Facebook fue hackeada una vez debido a que PHPList hizo lo mismo, antes de los días de los administradores de contraseñas. De todos modos, Yii facilita el cifrado y la verificación segura de las contraseñas.

La función de cifrado de Yii utiliza bcrypt para generar hashes para tu contraseña. Cuando la gente se registra, se crea un hash:

$ hash = Yii :: $ app-> getSecurity () -> generatePasswordHash ($ contraseña);

Luego, cuando el usuario intenta iniciar sesión, se procesa y se compara con el hash en la base de datos:

if (Yii :: $ app-> getSecurity () -> validatePassword ($ password, $ hash)) // todo correcto, iniciando sesión el usuario else // contraseña incorrecta

Pero también puedes usar Yii para proteger datos con criptografía.

Criptografía

El Marco Yii proporciona una serie de características integradas para admitir la protección de datos:

  • Funciones de generación de contraseñas y contraseñas, como generateRandomKey, generateRandomString y generateSalt.
  • Validación de la contraseña: generatePasswordHash () y validatePassword ().
  • Cifrado / descifrado: encryptByKey (), decryptByKey (), encryptByPassword () y decryptByPassword ().
  • Derivación de claves utilizando algoritmos estándar: pbkdf2 () y hkdf ().
  • Prevención de manipulación de datos: hashData () y validateData ().

Vistas de seguridad

Cualquier dato que provenga de los usuarios posiblemente esté infectado con ataques como la inyección de SQL o los scripts de varios navegadores. Es importante que todos los datos que envíe a los usuarios en las vistas deben ser limpiados. Yii ofrece un par de métodos para esto.. 

Primero, hay Html :: codificar, que esencialmente rompe cualquier SQL o scripting:

 
nombre)?>

Y hay integración con la biblioteca HtmlPurifier para bloques de texto más grandes:

 
texto)?>

Iniciar sesión a través de Auth Client

Yii también proporciona la capacidad de autenticación de terceros, lo cual es especialmente útil para admitir el inicio de sesión social a través de Google, Facebook, Twitter, etc..

He escrito varios tutoriales para Envato Tuts + sobre el uso de AuthClient en el marco de Yii con inicio de sesión social:

  • Construyendo su inicio: simplificando Onramp con AuthClientpublicación pendiente)
  • Cómo programar con Yii2: Autenticación de Google
  • Cómo programar con Yii2: Integración de AuthClient con Twitter, Google y otras redes

He encontrado que el inicio de sesión social funciona muy bien para el Planificador de reuniones. Los nuevos usuarios pueden comenzar a programar una reunión sin una contraseña.

Mejores prácticas

Yii también recomienda algunas de las mejores prácticas cuando se trata de la seguridad de las aplicaciones web. Y su documentación proporciona una buena introducción a estos temas para cualquiera..

  1. Filtrado de entrada y salida
  2. Evitar las inyecciones de SQL
  3. Evitar las secuencias de comandos entre sitios (XSS)
  4. Evitar la falsificación de solicitudes entre sitios (CSRF)
  5. Evitar la exposición de archivos
  6. Evitar información y herramientas de depuración en la producción
  7. Usando conexión segura sobre TLS

Los tres primeros temas anteriores se gestionan bien mediante la codificación analizada anteriormente en Vistas de seguridad

Yii también proporciona protección CSRF incorporada para actividades comunes, y puede desactivarse cuando sea necesario. En el Meeting Planner, tuve que desactivar CSRF para aceptar mensajes publicados desde los servicios API de Mailgun.

En cuanto a la exposición de archivos, el marco ayuda a minimizar esto al canalizar todas las solicitudes de entrada en el archivo de solicitud web / index.php. Esto limita enormemente la necesidad de escribir código de aplicación que filtre las solicitudes. Se maneja bien en un solo lugar..

Finalmente, el uso de HTTPS puede ayudar a proteger sus conexiones y trabajar con Yii para proteger a los usuarios. A principios de este año, escribí sobre Let's Encrypt: puedes usar este tutorial para instalar aplicaciones HTTPS para Yii también..

Quiero leer más?

Si está interesado en leer material más detallado sobre estos temas, el marco Yii 1.x ofrece estas publicaciones. Ciertamente, son más antiguos y menos específicos para Yii 2, pero siguen siendo útiles.

  • Temas Especiales: Seguridad
  • Cómo escribir aplicaciones Yii seguras
  • Yii guía de seguridad extendida

Para concluir

Espero que hayas disfrutado mi resumen de seguridad para Yii2. Si integra aspectos de la mayoría o todos los conceptos anteriores en su aplicación, debe tener un servicio web básicamente seguro. Si lo desea, puede consultar nuestra serie Construyendo su inicio con PHP para la implementación en el mundo real de algunas de estas prácticas de seguridad..

Vea los próximos tutoriales en nuestra serie Programming With Yii2 a medida que continuamos explorando diferentes aspectos del marco. Acojo con agrado las solicitudes de características y temas. Puede publicarlos en los comentarios a continuación o enviarme un correo electrónico a mi sitio web de Lookahead Consulting.

Si desea saber cuándo llegará el próximo tutorial de Yii2, síganme @reifman en Twitter o consulte la página de mi instructor. La página de mi instructor incluirá todos los artículos de esta serie tan pronto como se publiquen.. 

Trabajemos juntos para mantener felices a las diosas editoriales..

enlaces relacionados

  • Yii Mejores Prácticas de Seguridad
  • Yii clase de seguridad base 
  • Yii2 Developer Exchange