Nuevo en Symfony 2.7: Mejoras relacionadas con la seguridad

Cuando se publica una nueva versión de Symfony, lo que más llama la atención son sus grandes novedades. Sin embargo, una de las mejores cosas de Symfony es que cada nueva versión también añade pequeñas mejoras y cambios en todas sus funcionalidades.

En este artículo presentamos tres de esas pequeñas mejoras relacionadas con la seguridad y que te ayudarán a mejorar tu productividad.

Añadida una representación textual de los usuarios

Algunos programadores utilizan el método mágico __toString() de PHP para añadir la representación textual de los usuarios de la aplicación. En otras palabras, ese método permite utilizar (string) $user en el código PHP y {{ user }} en las plantillas Twig para mostrar el nombre del usuario.

El problema es que en los tests funcionales normalmente se usan usuarios del proveedor especial in-memory para que los tests sean más sencillos. Como seguramente sabes, estos usuarios creados con la clase User del core de Symfony no incluyen ese método __toString(), por lo que el código de tu aplicación no funciona bien.

Así que en Symfony 2.7 se ha decidido añadir el siguiente método sencillo en la clase User para hacer que tu trabajo sea más sencillo:

// src/Symfony/Component/Security/Core/User/User.php
public function __toString()
{
    return $this->getUsername();
}

Esta funcionalidad ha sido desarrollada por Tobias Sjösten en el pull request #9782 de Symfony.

Mejorada la extensión logout de Twig

Symfony define muchas extensiones de Twig para que puedas usar en las plantillas funcionalidades ofrecidas por los componentes. Seguro que conoces y utilizas muchas de estas extensiones, como la función render(), el filtro |trans y la etiqueta {% form_theme %}.

Una de las exteniones menos conocidas y utilizadas es la que define las funciones logout_path y logout_url. Estas funciones generan, respectivamente, la URL relativa y absoluta para desconectarse (cerrar la sesión) del firewall cuyo nombre se indica como argumento:

<a href="{{ logout_path('nombre_firewall') }}">Cerrar sesión</a>

En Symfony 2.7 hemos hecho que el nombre del firewall sea opcional. Si no lo indicas, se genera la URL para el firewall en el que está conectado el usuario:

<a href="{{ logout_path() }}">Cerrar sesión</a>

Al margen de la pequeña mejora que supone en tus plantillas, lo bueno es que ahora esta función la puedes usar cuando no sabes el nombre del firewall. Esto sucede por ejemplo en las plantillas de los bundles publicados como bundles de terceros.

Esta funcionalidad ha sido desarrollada por Joshua Thijssen en el pull request #13342 de Symfony.

Añadido un comando para codificar contraseñas

Symfony 2.7 añade un nuevo comando llamado security:encode-password que permite codificar contraseñas para el tipo de usuario indicado:

Symfony encoded password

¿Para qué sirve este comando? En primer lugar, cuando usas el proveedor de usuario in-memory, no es nada fácil codificar la contraseña para guardarla en el archivo security.yml. De hecho, si tus usuarios usan el codificador sha512, tienes que ejecutar el siguiente código PHP para codificar la contraseña a mano:

$ php -r '$pass = "..."; $salt = "..."; $iterations=5000; $salted = $pass.$salt; $digest = hash("sha512", $salted, true); for($i=1; $i<$iterations; $i++) { $digest = hash("sha512", $digest.$salted, true); } echo base64_encode($digest);'

En Symfony 2.7 puedes conseguir lo mismo ejecutando simplemente:

$ php app/console security:encode-password 'contraseña' 'AppBundle\Entity\User'

Por defecto el valor salt añadido a las contraseñas se genera automáticamente. Si tus contraseñas no lo usan, añade la opción --empty-salt al comando. Lo que no puedes hacer es indicar el salt a mano, ya que eso se considera una mala práctica de seguridad (por ejemplo, en PHP 7 la opción salt de la función password_hash() se ha declarado obsoleta).

Además de los proveedores in-memory este comando es muy útil cuando desarrollas la aplicación Symfony y tienes que comprobar o actualizar alguna contraseña almacenada en la base de datos.

Esta funcionalidad ha sido desarrollada por Sarah Khalil y Maxime Steinhausser en los pull request #12818 y #14032 de Symfony.

Fuente: New in Symfony 2.7: Security Improvements

Comentarios

Este artículo ya no permite añadir más comentarios.
¿Por qué? Los artículos cierran sus comentarios automáticamente unos meses después de su publicación para asegurar que estos sigan siendo relevantes.

Publicada el

17 de abril de 2015

Proyectos Symfony destacados

La forma más sencilla de generar el backend de tus aplicaciones Symfony. Ver más

Síguenos en @symfony_es para acceder a las últimas noticias.