4webs

Información Confidencial Expuesta en Prestashop. Solucionado en 1.7.3.1

Tal y como nos muestra Armando Salvador, formador oficial de Prestashop en España, en su vídeo, en la versión 1.7.2 se detectó un fallo de seguridad que afecta a las versiones anteriores a la 1.7.3.1. Según él, no se trata de un fallo grave pero al poner en riesgo cierta información confidencial y que pueda beneficiar a la competencia, para curarnos en salud, lo que mejor es solventar este fallo de seguridad tan pronto como sea posible. En este artículo vemos cómo detectar ese fallo y cómo solventarlo.

Tal vez te interese saber el calendario sobre las actualizaciones de versiones y parches de Prestashop.

Información expuesta en versiones anteriores a la 1.7.3.1

De lo que se trata este fallo de seguridad, detectado en la versión 1.7.2 y que afecta a versiones anteriores a la 1.7.3.1 como comentábamos, es que cuando se solicitaba información sobre un producto, esta solicitud devolvía la información sobre los productos al evento, como por ejemplo una petición a ajax (carrito), mostrándose la información sujeta y susceptible a no ser presentada como comenta Armando. Esto quiere decir que cuando añadimos un producto en el carrito de compra, hay información sobre ese producto que no debería ser visible cuando inspeccionamos la página, como pueda ser el coste del producto.

Es cierto que se muestra información del producto como es normal, relacionada con la cantidad de productos añadidos al carrito por ejemplo. Si nos vamos a la parte de «Network» como dice en el vídeo, aquí podremos revisar cualquier elemento relacionado con Ajax. Si hacemos como Armando, que añadimos un producto estando en la página de carrito, nos aparece información de la petición. En las diversas pestañas, podremos ver el header, la preview de la petición, la respuesta que ha habido tras la petición incluso el tiempo de respuesta y las cookies.

Dentro de la pestaña «Preview«, podemos encontrar el objeto «Cart«, que es el objeto que usa Prestashop para controlar toda la información relacionada con los productos que están en el carrito y en general del carrito en cuestión. Al desplegar la información, vemos los datos normales pero, debido a la unión que hizo PS del back-office y front-office en versiones anteriores, es aquí cuando se expone información confidencial.

Hay que remarcar que este problema fue reportado a Prestashop y por eso éste lo corrigió en la última versión 1.7.3.1. El objeto «Wholesale_price» muestra el valor del precio de compra y como verás en el ejemplo que muestra en el vídeo, si la blusa tiene un precio de venta de 32,66€, su precio de compra ha sido de 8,10€. Esta información queda expuesta y no solo esta información sino también una referencia del proveedor más otra información que no es tan importante que se muestre.

Información Confidencial expuesta en versiones anteriores de Prestashop 1.7.3.1

Solución: Actualizar Prestashop a la 1.7.3.1

Lo que ha hecho Prestashop es que a partir de la versión 1.7.3.1, incluye un sistema de filtrado basado en una «Whitelist», en español Lista Blanca. Los datos que se envían al cliente son los que se filtran pero los objetos de Smarty se mantienen como estaban.

Una WhiteList deja que las tiendas online estén seguras por defecto. La información es más segura y es difícil que haya algún tipo de fuga. Los desarrolladores tienen que incluir la nueva información a esa lista blanca.  Si los datos no se usan, nada ocurre pero si la información es utilizada, los desarrolladores son alertados rápidamente.

¿Cómo afecta a las tiendas Prestashop customizadas?

Si los datos de tu tienda Prestashop los tienes personalizados en la plantilla Smarty, no tienes por qué hacer nada porque los objetos se envían a los templates sin filtrar por lo que todo debería de funcionar igual que antes.

Si necesitas que los datos personalizados estén en la parte del cliente, tienes que añadir los datos al servicio de filtrado del front end así:

Desde que los módulos de Prestashop 1.7.3.1 son accesibles desde el contenedor de dependencia de los controladores del back office, también se puede tener acceso al contenedor del front office por ello, para acceder al servicio de filtrado desde el módulo tienes que ejecutar este código:

$this->get('prestashop.core.filter.front_end_object.main');

Añadir una propiedad a la White List

Puedes añadir un mug_product_url a la lista blanca usando el módulo ligado al hook actionFrontControllerAfterInit:

public function hookActionFrontControllerAfterInit()
{
$filterManager = $this->get('prestashop.core.filter.front_end_object.main');

// get list of all filters applied to client-side data
$filters = $filterManager->getFilters();

// get list of all filters applied to the cart object
$cartFilters = $filters['cart']->getFilters();

// get list of filters applied to each product inside the cart object
$productFilterQueue = $cartFilters['products']->getQueue();

foreach ($productFilterQueue as $filter) {
// add puffin_product_url to the product whitelist
// note: whitelist() needs an array regardless of the number of elements to whitelist
if ($filter instanceof PrestaShop\PrestaShop\Core\Filter\FrontEndObject\ProductFilter) {
$filter->whitelist(array('mug_product_url'));
}
}
}

Eliminar una propiedad

Si quieres eliminar por ejemplo el precio de la información expuesta del carrito, puedes realizar el mismo paso anterior así:

public function hookActionFrontControllerAfterInit()
{
$filterManager = $this->get('prestashop.core.filter.front_end_object.main');

// get list of all filters applied to client-side data
$filters = $filterManager->getFilters();

// get list of all filters applied to the cart object
$cartFilters = $filters['cart']->getFilters();

// get list of filters applied to each product inside the cart object
$productFilterQueue = $cartFilters['products']->getQueue();

foreach ($productFilterQueue as $filter) {
// remove "price" from the product whitelist
if ($filter instanceof PrestaShop\PrestaShop\Core\Filter\FrontEndObject\ProductFilter) {
$filter->removeFromWhitelist('price');
}
}
}

Hacer que nueva información esté disponible en el Front

Por último, si quieres añadir un elemento tipo my_custom_data al objeto de Prestashop, esta vez el hook es: actionBuildFrontEndObject y añade my_custom_data a $params:

public function hookActionBuildFrontEndObject(&$params) {
// contains all the data in the prestashop object
$prestashopObject =& $params['obj'];

// add custom data like this
$prestashopObject['my_custom_data'] = 'foobar';
}

Con precaución, esto te da la posibilidad de alterar el objeto Prestashop después de que haya sido filtrado.

Puede que te interese saber por qué es importante contratar soporte para Prestashop.

Información vía Armando Salvador y el blog Build de Prestashop.