File manager - Edit - /var/www/html/portal/app/Helpers/HtmlSanitizer.php
Back
<?php namespace App\Helpers; /** * Sanitizador de HTML para conteúdo de texto rico proveniente de editores * administrativos que é renderizado de forma não escapada ({!! !!}) em páginas * públicas. * * Estratégia (defesa em profundidade), aplicada tanto na gravação quanto na * renderização: * - remove tags perigosas com seu conteúdo (script, style, iframe, etc.); * - remove atributos de evento (on*) e atributos perigosos (style com expressões); * - neutraliza URIs perigosas (javascript:, vbscript:, data: exceto imagens) em href/src. * * Não substitui uma whitelist completa (ex.: HTMLPurifier), mas mitiga os * vetores de XSS mais comuns sem adicionar dependências. */ class HtmlSanitizer { /** * Tags removidas integralmente (abertura, conteúdo e fechamento). */ private const DANGEROUS_TAGS = [ 'script', 'style', 'iframe', 'object', 'embed', 'form', 'applet', 'meta', 'link', 'base', 'svg', 'math', 'frame', 'frameset', 'noscript', ]; /** * Sanitiza um trecho de HTML para renderização segura. */ public static function sanitize(?string $html): string { if ($html === null) { return ''; } // Resolve entidades para evitar que payloads codificados (ex.: <script>) // escapem da limpeza ao serem decodificados na renderização. $decoded = html_entity_decode($html, ENT_QUOTES | ENT_HTML5, 'UTF-8'); if (trim($decoded) === '') { return ''; } $tags = implode('|', self::DANGEROUS_TAGS); // Remove tags perigosas com conteúdo. $decoded = preg_replace('#<(' . $tags . ')\b[^>]*>.*?</\1>#is', '', $decoded) ?? $decoded; // Remove tags perigosas órfãs/auto-fechadas remanescentes. $decoded = preg_replace('#</?(' . $tags . ')\b[^>]*>#is', '', $decoded) ?? $decoded; // Remove atributos de evento inline (onclick, onerror, onload, etc.). $decoded = preg_replace('/\son[a-z0-9_-]+\s*=\s*("[^"]*"|\'[^\']*\'|[^\s>]+)/i', '', $decoded) ?? $decoded; // Neutraliza URIs perigosas em href/src (mantém data:image/* para imagens inline). $decoded = preg_replace_callback( '/\s(href|src)\s*=\s*("([^"]*)"|\'([^\']*)\'|([^\s>]+))/i', static function (array $m): string { $attr = strtolower($m[1]); $value = $m[3] ?? ''; if ($value === '' && isset($m[4])) { $value = $m[4]; } if ($value === '' && isset($m[5])) { $value = $m[5]; } $normalized = strtolower(trim(html_entity_decode($value, ENT_QUOTES | ENT_HTML5, 'UTF-8'))); $normalized = preg_replace('/\s+/', '', $normalized) ?? $normalized; $isDangerous = str_starts_with($normalized, 'javascript:') || str_starts_with($normalized, 'vbscript:') || (str_starts_with($normalized, 'data:') && !str_starts_with($normalized, 'data:image/')); if ($isDangerous) { return ' ' . $attr . '="#"'; } return $m[0]; }, $decoded ) ?? $decoded; return $decoded; } }
| ver. 1.4 |
Github
|
.
| PHP 8.3.28 | Generation time: 0.4 |
proxy
|
phpinfo
|
Settings