<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Composer - Matteo Cisilino</title>
	<atom:link href="https://www.cisilino.com/es/tag/composer/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.cisilino.com/es/</link>
	<description>Guide su WordPress, server e sicurezza</description>
	<lastBuildDate>Tue, 03 Nov 2026 08:02:50 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.4</generator>
	<item>
		<title>Actualizaciones de seguridad Laravel: cómo las monitorizo</title>
		<link>https://www.cisilino.com/es/2026/11/03/actualizaciones-seguridad-laravel-composer-audit/</link>
					<comments>https://www.cisilino.com/es/2026/11/03/actualizaciones-seguridad-laravel-composer-audit/#respond</comments>
		
		<dc:creator><![CDATA[matteocisilino]]></dc:creator>
		<pubDate>Tue, 03 Nov 2026 08:00:00 +0000</pubDate>
				<category><![CDATA[Servidores y bases de datos]]></category>
		<category><![CDATA[actualización]]></category>
		<category><![CDATA[Composer]]></category>
		<category><![CDATA[gestión de servidores]]></category>
		<category><![CDATA[Laravel]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[script de bash]]></category>
		<guid isPermaLink="false">https://www.cisilino.com/?p=1393</guid>

					<description><![CDATA[<p>Cómo monitorizo las actualizaciones de seguridad Laravel en mis servidores de producción: composer audit, composer outdated y el seguimiento del ciclo de vida del framework.</p>
<p>The post <a href="https://www.cisilino.com/es/2026/11/03/actualizaciones-seguridad-laravel-composer-audit/">Actualizaciones de seguridad Laravel: cómo las monitorizo</a> first appeared on <a href="https://www.cisilino.com/es/">Matteo Cisilino</a>.</p>]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">Gestiono varios servidores en producción. La mayor parte del tráfico que pasa por mis hostings va hacia sitios WordPress. Pero no todo. Cuando un cliente me pide un software de gestión a medida, un backend para una app, o un pequeño e-commerce con reglas no estándar, el CMS ya no basta. Ahí entran en juego los frameworks PHP. Para las <strong>actualizaciones de seguridad Laravel</strong> he montado un control que realmente ejecuto, no solo en teoría.</p>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" src="https://www.cisilino.com/wp-content/uploads/2026/10/aggiornamenti-sicurezza-laravel-composer-audit.webp" alt="actualizaciones de seguridad Laravel: escudo y paquetes Composer en estilo line-art" width="1200" height="630"/></figure>



<h2 class="wp-block-heading">Cuántos sitios son CMS y cuántos son aplicaciones a medida</h2>



<p class="wp-block-paragraph">Los datos de W3Techs dicen que alrededor del 68% de los sitios con un CMS reconocido usa WordPress, Shopify o una plataforma similar. El resto, poco más de un tercio de la web pública monitorizada, no usa ninguno de los CMS que esas estadísticas rastrean. Ahí dentro hay sitios estáticos, pero también muchísimas aplicaciones a medida. No es un dato perfecto. «Ningún CMS detectado» no equivale exactamente a «aplicación a medida». Pero la dirección es clara: las web apps hechas a mano siguen siendo una porción enorme de internet.</p>



<p class="wp-block-paragraph">Entre los frameworks PHP usados para estas aplicaciones, Laravel es hoy el más extendido. La encuesta State of PHP 2025 de JetBrains, sobre más de 1.700 desarrolladores, reporta un 64% de uso para Laravel. Symfony le sigue, pero bastante más atrás. En mis hostings la situación es coherente con esta tendencia. Las aplicaciones a medida que gestiono para los clientes, cuando no son WordPress, son casi siempre proyectos Laravel. Algún cliente llega ya con un proyecto existente que mantener. Otros me lo piden desde cero, sabiendo que es la opción más habitual del mercado. Los recuentos absolutos de sitios, de fuentes como BuiltWith, hay que tomarlos con cautela: Laravel incluye en su interior varios componentes de Symfony, y esto confunde un poco las estadísticas basadas solo en los paquetes instalados. Pero el panorama general no cambia: para quien escribe aplicaciones PHP a medida, hoy Laravel es el punto de partida más habitual, no la excepción.</p>



<h2 class="wp-block-heading">Cómo monitorizo las actualizaciones de seguridad Laravel</h2>



<p class="wp-block-paragraph">Un proyecto Laravel en producción nunca está «terminado y quieto». El framework, sus componentes y las decenas de paquetes Composer que arrastra reciben parches cuando se encuentra un fallo. Si nadie lo controla, un sitio puede quedar vulnerable durante meses. El cliente, muchas veces, ni se entera. Es el mismo principio que aplico cuando tuve que <a href="https://www.cisilino.com/es/2026/10/29/php2shell-cve-2026-109618-mitigacion-servidor/">gestionar un ataque en curso en un servidor durante una emergencia de seguridad PHP</a>: mejor prevenir con un control regular, que correr detrás del problema después de que ya haya estallado.</p>



<p class="wp-block-paragraph">Por eso escribí un script bash sencillo. Lo ejecuto vía cron en cada proyecto Laravel que gestiono. También lo integro en los pipelines de deploy, cuando el cliente tiene uno. No hace magia: lee el archivo de lock de Composer y lo compara con las bases de datos de vulnerabilidades conocidas. Aquí está, tal cual lo uso yo, sin modificaciones.</p>



<h3 class="wp-block-heading">El script de auditoría</h3>



<pre><code>#!/usr/bin/env bash
set -euo pipefail

PROJECT_DIR="${1:-.}"
cd "$PROJECT_DIR"

echo "==> Project: $(pwd)"

if [[ ! -f composer.lock ]]; then
  echo "SKIP: composer.lock non trovato (non sembra un progetto composer installato)."
  exit 0
fi

echo ""
echo "==> Composer audit (vulnerabilità note)"
# --no-interaction utile in CI; fallisce (exit code != 0) se trova advisory
composer audit --no-interaction

echo ""
echo "==> Pacchetti outdated (info)"
composer outdated --direct || true

echo ""
echo "==> Laravel version (se presente)"
php -r '
$lock=json_decode(file_get_contents("composer.lock"), true);
$pkgs=array_merge($lock["packages"] ?? [], $lock["packages-dev"] ?? []);
$laravel=null;
foreach ($pkgs as $p) { if (($p["name"] ?? "")==="laravel/framework") { $laravel=$p["version"] ?? null; break; } }
echo $laravel ? "laravel/framework: $laravel\n" : "laravel/framework non trovato nel lock\n";
'
</code></pre>



<p class="wp-block-paragraph"><strong>Aviso</strong>: el script se proporciona tal cual, con fines informativos. Su uso es bajo tu exclusiva responsabilidad: no asumo ninguna responsabilidad por pérdida de datos, interrupciones del servicio, o cualquier error provocado por un uso incorrecto o por un contexto distinto al que yo mismo utilizo. Haz siempre una copia de seguridad independiente antes de ejecutarlo en producción.</p>



<p class="wp-block-paragraph"><code>composer audit</code> es un comando integrado en Composer desde la versión 2.4. Lee las versiones exactas de los paquetes dentro de <code>composer.lock</code>. Las compara con una base de datos de advisories de seguridad publicadas. La base de datos llega a través de Packagist, que a su vez se apoya en el repositorio FriendsOfPHP/security-advisories y en el GitHub Advisory Database. Si encuentra una coincidencia, lista el paquete, la versión vulnerable y el advisory relacionado. Luego termina con un código de salida distinto de cero. Este es el detalle que más me interesa. Un exit code no-zero es lo que permite que un cron o un pipeline entienda por sí solo que algo hay que revisar. No tengo que leer cada línea de log a mano.</p>



<p class="wp-block-paragraph">En los proyectos en producción lo lanzo una vez al día vía cron, con la salida enviada por email si el comando falla. En algún cliente más estructurado lo he integrado también en el pipeline de deploy. Si <code>composer audit</code> encuentra un advisory bloqueante, el deploy se detiene antes de llegar a producción. Mejor detenerse ahí que descubrirlo después, con el sitio ya online. Este control diario, repetido en cada proyecto, es el corazón práctico de las actualizaciones de seguridad Laravel que aplico de verdad, no solo cuando me acuerdo de hacerlo a mano.</p>



<p class="wp-block-paragraph">La segunda línea del script, <code>composer outdated --direct</code>, muestra solo las dependencias declaradas a mano en el <code>composer.json</code>. No muestra todo el árbol de dependencias transitivas. Un proyecto Laravel medio arrastra centenares de paquetes indirectos. Si los listara todos, la salida sería ilegible. Terminaría ignorándola, como pasa con demasiados avisos automáticos. Mirando solo las dependencias directas, veo de un vistazo lo que he elegido yo. Puedo decidir con calma qué actualizar y cuándo hacerlo.</p>



<p class="wp-block-paragraph">La última parte del script imprime la versión de <code>laravel/framework</code> presente en el lock file. Lo hago porque el ciclo de vida de las versiones de Laravel tiene plazos precisos. Quiero conocerlos sin abrir cada proyecto a mano, uno por uno. Según la tabla oficial de soporte publicada por Laravel, los parches de seguridad para la versión 11 terminaron el 12 de marzo de 2026. La versión 12 los recibe hasta el 24 de febrero de 2027. Desde el primer trimestre de 2026 la versión actual es Laravel 13. Planificar las actualizaciones de seguridad Laravel con tiempo también significa esto: saber en qué versión está parado cada proyecto, antes de que venza el soporte.</p>



<h2 class="wp-block-heading">Los límites honestos de este control</h2>



<p class="wp-block-paragraph"><code>composer audit</code> no es un antivirus. No lee el código de la aplicación. Señala solo vulnerabilidades conocidas y ya publicadas en un advisory. Contra un fallo zero-day, descubierto pero aún no divulgado, no sirve de nada. Por eso lo considero un control de higiene básica, no una garantía absoluta. Las <a href="https://getcomposer.org/doc/03-cli.md#audit" target="_blank" rel="noopener">actualizaciones regulares de los paquetes</a> siguen siendo la práctica más eficaz, incluso sin un advisory en curso. La documentación oficial de Laravel recomienda mantenerse en la versión actual del framework. También recomienda automatizar las pruebas antes de cada actualización de major. Sirve para convertir la actualización en una costumbre, no en una emergencia de último minuto.</p>



<p class="wp-block-paragraph">Queda el hecho de que un script de pocas líneas, lanzado cada día, me habría ahorrado más de un email incómodo a los clientes, en los años en que todavía no lo usaba. Hoy forma parte de la rutina de mantenimiento de cada proyecto Laravel que sigo. Lo combino con la monitorización de los logs y de los intentos de acceso en los servidores. Las actualizaciones de seguridad Laravel no eliminan el riesgo. Lo reducen bastante. Y cuestan muy poco, comparadas con un sitio comprometido y un cliente que pierde confianza.</p><p>The post <a href="https://www.cisilino.com/es/2026/11/03/actualizaciones-seguridad-laravel-composer-audit/">Actualizaciones de seguridad Laravel: cómo las monitorizo</a> first appeared on <a href="https://www.cisilino.com/es/">Matteo Cisilino</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://www.cisilino.com/es/2026/11/03/actualizaciones-seguridad-laravel-composer-audit/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
