Tips para administradores de sitios web

¡¡¡Webmasters!!! Hay que saber todo, porque sino dependemos de la profesionalidad de terceros o de su buena voluntad de terceros

Redsys, error 403 usando Cloudflare

Introducción

Hoy me ha llamado la atención cuando un cliente me ha expuesto el problema, en el que su pasarela Redsys, le daba un error en el que tras un pogo, el retorno de Redsys, no se efectuaba, y por tanto el carrito quedaba pagado pero no figuraba como tal en la tienda. Sus pedidos quedaban pendientes de pago, pese a estar debidamente procesados en Redsys.

Al ir a buscar información me encuentro con post que dan mil vueltas, pero no llegan a la raíz y otros que dieron la apertura fácil (gracias, más abajo os enlazo)

Redsys como siempre, amables, pero poco operativos, le indicaron el que podía ser pero con escueta y difusa información. El cliente entendió un error de java y que tenía un error 403, que pudo ver en la intranet de cliente en redsys.

Error en pasarela intranet

Análisis

Lo primero que me vino a la cabeza fue ver los logs (lo primero que hay que hacer en cualquier análisis técnico) y allí descubrí que no había error 403. ¿Cómo es eso?

Viendo los logs de Apache, donde no había ningún error 403 asociado las path, algo extraño ocurría. Así que la siguiente prueba fue determinar su resolución DNS.

Todo quedó claro: el cliente usa CloudFlare como servicio de distribución, cacheado y seguridad de contenidos.

Y aquí estaba claro que la respuesta o callback que retorna la pasarela Redsys no llegaba al servidor y esto suele tener nombre proxy o firewall (tipo mod_security o desarrollo propio como el caso de Cloudflare)

Primera salida para solventarlo

Algunos lo primero y único que hacen es, desactivar el firewall, el camino más habitual en muchos técnicos (algunos intitulados como Especialista en CiberSeguridad) lo cual es un craso error.

Jamás debemos ir a lo fácil, por esto será difícil, tarde o temprano.

Análisis de logs de Cloudflare

En nuestro dashboard de Cloudflare, tenemos un área para el Firewall, y allí, tenemos un sistema de log de eventos llamado Información general donde podemos reviar el log, consultar por rangos de fechas.

Cloudflare > Firewall > Información General

Podemos crear una regla con esos datos, y tambien hacerlo directamente desde los botones que aparecen si ponemos el puntero del ratón encima de Servicio pero prefiero hacerlo desde el menú Firewall > Reglas de firewall

Añadir una regla en el firewall

Debemos pues añadir dos reglas con la condicional Y

ASN que es el número de Sistema Autónomo de la red que en este caso si es de apropiado ponerla porque es una red bancaria, y es confiable, y además es posible que nos cambien o modifiquen alguna vez la IP, que en este caso para la red de Redsys-Sermepa es el AS31627, pero solo usaremos la parte numérica. Y el identificador URI - Identificador de recursos uniforme del callback de nuestra aplicación de comercio electrónico.

Cloudflare > Firewall > Reglas de firewall

Por último nos queda añadir la acción a esta regla, que como vimos en el log, debería ser Omitir > Comprobación de integridad del navegador

Enlaces

Aviso

Esta documentación y su contenido, no implica que funcione en tu caso o determinados casos. También implica que tienes conocimientos sobre lo que trata, y que en cualquier caso tienes copias de seguridad. El contenido el contenido se entrega, tal y como está, sin que ello implique ningún obligación ni responsabilidad por parte de Castris

Si necesitas soporte profesional puedes contratar con Castris soporte profesional.

exception 'DOMPDF_Exception' with message 'No block-level parent found. Not good.

Introducción

Algunas veces con cambios entre servidores o proveedores de hosting, las aplicaciones de nuestros clientes, sufren ciertos descalabros, como por ejemplo el mostrar una página en blanco en lugar de renderizar un documento PDF.

Como norma general pensaremos en que hay un problema de nuestro servidor o hosting, en el que falta tal o cual extensión.

Craso error. Lo primero es lo primero. Hay que ver los logs.

Análisis

Podemos acceder vía SSH a nuestra shell o en su defecto via cPanel Acceso shell via cPAnel

Como podemos ver el error es claro:

[14-Jul-2021 05:49:24 UTC] Error al generar certificado : exception 'DOMPDF_Exception' with message 'No block-level parent found.  Not good.' in /home/dentista/public_html/dompdf/include/inline_positioner.cls.php:38
Stack trace:
#0 /home/dentista/public_html/dompdf/include/frame_decorator.cls.php(546): Inline_Positioner->position()
#1 /home/dentista/public_html/dompdf/include/text_frame_reflower.cls.php(331): Frame_Decorator->position()
#2 /home/dentista/public_html/dompdf/include/frame_decorator.cls.php(556): Text_Frame_Reflower->reflow(NULL)
#3 /home/dentista/public_html/dompdf/include/page_frame_reflower.cls.php(138): Frame_Decorator->reflow()
#4 /home/dentista/public_html/dompdf/include/frame_decorator.cls.php(556): Page_Frame_Reflower->reflow(NULL)
#5 /home/dentista/public_html/dompdf/include/dompdf.cls.php(817): Frame_Decorator->reflow()
#6 /home/dentista/public_html/pdfCerMaster.php(125): DOMPDF->render()
#7 {main}
Si nuestro proveedor usa PHP-FPM, los logs estarán en la carpeta `~/logs` con el formato `dominio_tld.php.error.log` 
Otros escenarios como fcgi, suPHP, etc, variarán según la configuración que el administrador haya impuesto por defecto o de manera personalizada

Este error no tiene nada que ver con la existencia o no de determinada extensión, sino con un error de en el analizador (parsing) de HTML5.

Corrección

Debemos localizar el fichero de configuración que defina la variable DOMPDF_ENABLE_HTML5PARSER o en su defecto si nuestra app no la tiene acudiremos a la de la propia librería.

Buscamos el posible fichero

$ find . -type f -exec grep -il "DOMPDF_ENABLE_HTML5PARSER" {} \;
./dompdf/include/dompdf.cls.php
./dompdf/changelog.txt
./dompdf/dompdf_config.custom.inc.php
./dompdf/dompdf_config.inc.php
./lib/dompdf/include/dompdf.cls.php
./lib/dompdf/www/setup.php
./lib/dompdf/changelog.txt
./lib/dompdf/dompdf_config.custom.inc.php
./lib/dompdf/dompdf_config.inc.php

Por los nombres me acerco a pensar en ./dompdf/dompdf_config.inc.php el cual paso a editar:

define("DOMPDF_ENABLE_HTML5PARSER", true);

Esto puede que funcione o no, pero al menos, me mostrará los errores de las etiquetas de HTML de una forma más adecuada.

Enlaces

Aviso

Esta documentación y su contenido, no implica que funcione en tu caso o determinados casos. También implica que tienes conocimientos sobre lo que trata, y que en cualquier caso tienes copias de seguridad. El contenido el contenido se entrega, tal y como está, sin que ello implique ningún obligación ni responsabilidad por parte de Castris

Si necesitas soporte profesional puedes contratar con Castris soporte profesional.