Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Security

Programando con Yii2: Seguridad

by
Read Time:11 minsLanguages:
This post is part of a series called How to Program With Yii2.
Programming With Yii2: Using Ajax
Programming With Yii2: Automated Testing With Codeception

Spanish (Español) translation by Rafael Chavarría (you can also view the original English article)

Si te estás preguntando, "¿Qué es Yii?" ve la Introducción al Framework Yii, la cuál revisa los beneficios de Yii e incluye un vistazo a Yii 2.0.

En esta serie de Progrmando con Yii2, estoy guiando a los lectores en el uso del framework Yii2 para PHP. Si estás planeando compartir tu aplicación con el público, necesitarás que sea segura y es mejor planear esto desde el comienzo. Afortunadamente, comenzar con un framework como Yii hace esto mucho más fácil de lo que sería de otro modo. Como se plantea en Características de Yii:

Yii está equipado con muchas medidas de seguridad para ayudar a prevenir a tus aplicaciones Web de ataques como inyección SQL, cross-site scripting (XSS), cross-site request forgery (CSRF), y manipulación de cookies.

En este tutorial, te acompañaré a través de conceptos básicos de seguridad dentro del framework de aplicación Yii. Y, si estás interesado, los episodios futuros trabajarán para asegurar la aplicación, Planeador de Reuniones, destacada en nuestra serie startup, mientras se aproxima a su libreación alfa.

Antes de comenzar, por favor recuerda, trato de participar en las discusiones de abajo. Si tienes alguna pregunta o sugerencia de tema, por favor publica un comentario debajo o contáctame en Twitter @reifman.

Nota: Si has notado la brecha entre los episodios de la serie Programando con Yii, es porque tuve una cirugía de cerebro el año pasado. Gracias por si paciencia y apoyo--es agradable estar escribiendo regularmente otra vez, y estoy esperando continuar cubriendo Yii2.

Los Básicos de Seguridad Con Yii

Si eres nuevo en la seguridad de aplicación web, hay mucho que entender acerca de los ofrecimientos de Yii. Haré lo mejor por ofrecer un vistazo general a lo mejor de la documentación de Yii 2.0. El equipo de Yii divide la seguridad en siete áreas clave:

  1. Autentificación
  2. Autorización
  3. Trabajando con Contraseñas
  4. Criptografía
  5. Seguridad de vistas
  6. Autentificación de Clientes
  7. Mejores Prácticas

Comencemos dividiendo en estas una por una.

1. Autentificación

La presentación de Seguridad de Yii Framework de Ilko Kacharov ofrece unas diapositivas útiles que resumen la meta de autentificación (y el siguiente sub-tema, autorización). Esencialmente, aquí están las preguntas que esos temas necesitan responder:

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

El Modelo de Usuario e Interfaz de Identidad

La clase yii/web/User de Yii se integra con la interfaz yii\web\Identity para manejar el estado de autentificación de usuario dentro de tu aplicación.

El Noviembre pasado, escribí un tutorial acerca de la Pantilla Avanzada de Aplicación Yii. Una de las ventajas de la plantilla avanzada es que proporciona integración pre-construida del modelo de Usuario con ActiveRecord y tu base de datos. Así que tu aplicación ofrece autentificación manejada por base de datos desde el comienzo.

El modelo de Usuario te permite loguear y desloguear usuarios de manera programática.

  • login() establece la identidad especificada y recuerda el estado de autentificación en sesión y cookie.
  • logout() marca al usuario como invitado y limpia 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 funcionalidad de API.

La propiedad $isGuest determina si el usuario actual se ha registrado o no. Cuando el usuario está deslogueado, es nulo, de otra forma regresa una instancia de la IdentityInterface.

Esencialmente, necesitar unas clase de Usuario que extienda ActiveRecord e implemente métodos para soportar la IdentityInterface, de esta manera:

También, antes de que un usuario es creado, la aplicación genera una cadena aleatoria como clave de autorización. Esto puede ser usado en correos de "olvidó su contraseña" y otros enlaces de login basados en email.

Autorización

Yii proporciona dos aproximaciones integradas para autorización. La más simple Acces Control List (ACL) determina cuáles usuarios o procesos están tienen permitido realizar acciones en un recurso y el más intensivo Role-Based Access Control (RBAC) te ayuda a manejar accesos al definir roles. En RBAC, solo usuarios o tareas de sistema con roles específicos pueden realizar acciones específicas.

Access Control List

El ACL a veces es también llamado Access Control FIlter (ACF). Yii proporciona soporte ACL dentro de yii\filters\AccessControl. Es ideal para aplicaciones que solo necesitan control de acceso simple. Es lo que he usado hasta el momento en Planeador de Reuniones.

Aquí hay un ejemplo del SiteController común configurando un comportamiento de acceso para filtrar acceso a acciones disponibles, regularmente páginas. En este caso, ACL está actuando en el registro, login y logout. El '?' indica que cualquier usuario puede acceder a las páginas de login y registro, mientras que '@' indica que solo usuarios logueados o antentificados tienen permitido el acceso. En el ejemplo de abajo, solo los usuarios logueados se pueden desloguear.

Conforme el controlador crece, cada nueva acción necesita ser definida dentro de las reglas de AccessControl. Y, conforme tu aplicación crece, cada controlador y todas su acciones necesitan integrar el filtrado ACL por seguridad.

Control de Acceso Basado en Roles

Role-Based Access Control (RBAC) proporciona un sistema más robusto de autentificación pero también requiere mucho más diseño e implementación por adelantado.

Con RBAC, defines la autentificación a través de roles los cuales pueden ser heredados (o no) y aplicas los roles a usuarios. También puedes definir reglas para los roles. Las implementaciones RBAC pueden volverse bastante complejas.

En la figura inferior, los admin pueden realizar cualquier tarea y los autores pueden crear una publicación y actualizar sus propias publicaciones. Jane es un admin así que ella puede realizar tareas de administradores y John es solo un autor:

Yii Framework Role Based Access Control Inheritance IllustrationYii Framework Role Based Access Control Inheritance IllustrationYii Framework Role Based Access Control Inheritance Illustration

Yii implementa lo que se llama "un RBAC General Jerárquico, siguiendo el modelo NIST RBAC." La funcionalidad de RBAC es provista por su componente de aplicación authManager.

No entraré en mucho detalle con RBAC, pero espero hacerlo en un tutorial futuro. De nuevo, depende de las diosas editoriales--hablar con ellas nunca es sencillo:

Yii2 Security Editorial goddess NoOne at Envato Taking Care of BusinessYii2 Security Editorial goddess NoOne at Envato Taking Care of BusinessYii2 Security Editorial goddess NoOne at Envato Taking Care of Business
vía PopSugar

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

  • definir roles y permisos
  • establecer relaciones entre tus roles y permisos
  • definir cualquier regla que exista
  • asociar reglas con tus roles y permisos
  • y finalmente, asignar roles a usuarios

Puedes ver el código requerido para habilitar los inicios de un sistema RBAC abajo:

Para implementar RBAC, debes estar preparado para escribir mucho código por adelantado, o mientras tu aplicación crece. Y, si lo estás, Yii manejará la autentificación de acuerdo al framework de autentificación que definas. En otras palabras, diseñar y codificar por adelantado provee de autentificación sólida y detallada.

Trabajando Con Contraseñas

Como Mark Zuckerberg aprendió en Junio, algunos sitios web almacenan contraseñas en texto plano, pero el tuyo no debería; 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 administradores de contraseñas. De cualquier modo, Yii facilita encriptar y verificar contraseñas de manera segura.

La función crypt de Yii usa bcrypt para generar hashes para tu contraseña. Cuando la gente se registra, un hash es creado:

Después, cuando el usuario intenta iniciar sesión, se le hace un hash y se compara con el de la base de datos:

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

Criptografía

El Framework de Yii proporciona una cantidad de características integradas para soportar protección de datos:

Seguridad de Vistas

Cualquier información que viene de usuarios está posiblemente infectada con ataques tales como inyección SQL o scripts multi-navegador. Es importante que cualquier información que muestres a los usuarios en vistas se limpiada. Yii ofrece un par de métodos para esto.

Primero, hay Html::encode, el cuál esencialmente rompe cualquier SQL o script.

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

Login vía Autentificación de Cliente

Yii también proporciona la habilidad para autentificación de terceros, lo que es especialmente útil para soportar login social vía Google, Facebook, Twitter, etc.

He escrito varios tutoriales para Envato Tuts+ sobre usar AuthClient dentro del Framework Yii con logins sociales:

He encontrado que los logins sociales funcionan super bien para Planeador de Reuniones. Los nuevos usuarios pueden comenzar a programar una reunión sin una contraseña.

Mejores Prácticas

Yii también recomienda un puñado de buenas prácticas cuando se trata de seguridad de aplicación web. Y su documentación proporciona una buena introducción en esos temas para cualquiera.

  1. Filtrando Entrada y Salida
  2. Evitando Inyecciones SQL
  3. Evitando Cross-Site Scripting (XSS)
  4. Evitando Cross-Site Request Forgery (CSRF)
  5. Evitando exposición de archivos
  6. Evitando información y herramientas de depuración en producción.
  7. Usando una conexión segura sobre TLS

Los primeros tres temas de arriba son manejados bien por la codificación discutida arriba en Seguridad de Vistas.

Yii también proporciona protección CSRF integrada para actividades comunes--y puede ser apagada cuando se necesite. En Planificador de Reuniones, tuve que apagar CSRF para aceptar mensajes publicados desde la API de servicios de Mailgun.

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

Finalmente, usar HTTPS puede ayudar a salvaguardar tus conexiones y trabajar con Yii para proteger usuarios. Más temprano este año, escribí acerca de Encriptemos--puedes usar este tutorial para instalar HTTPS para apps Yii también.

¿Quieres leer más?

Si estás interesado en leer más material detallado en estos temas, el Framework 1.x de Yii ofrece estas publicaciones. Ciertamente, son más viejas y menos específicas que Yii2, pero permanecen útiles.

En Conclusión

Espero que hayas disfrutado mi vistazo a Yii2. Si integras aspectos de la mayoría o todos los conceptos de anteriores en tu aplicación, deberías tener un servicio web asegurado básicamente. Deberías querer revisar nuestra seria Construyendo Tu Startup Con PHP para implementación del mundo real de estas prácticas de seguridad.

Espera tutoriales por venir en nuestra serie Programando Con Yii2 mientras continuamos sumergiéndonos en diferentes aspectos del framework. Recibo con gusto peticiones de características y temas. Puedes publicarlas en los comentarios de abajo o mandarme un correo en mi sitio web Lookahead Consulting.

Si te gustaría saber cuando llegue el siguiente tutorial de Yii2, sígueme en Twitter @reifman o revisa mi página de instructor. Mi página de instructor incluirá todos los artículos de esta serie tan pronto sean publicados.

Trabajemos juntos para mantener a las diosas editoriales contentas.

Enlaces Relacionados

Advertisement
Did you find this post useful?
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.