Метод sanitizeFor
Метод sanitizeFor класса HtmlSanitizer выполняет очистку HTML-строки с учётом контекста, в котором эта строка будет выведена. Первым параметром передаётся контекст использования, вторым - очищаемая строка. Третьим необязательным параметром можно передать имя санитайзера.
Контекст задаётся строкой и определяет, какие теги и атрибуты будут разрешены. Например, для контекста 'default' разрешается безопасный набор HTML-тегов, а для 'empty' все теги удаляются, оставляя только текстовое содержимое.
Синтаксис
public function sanitizeFor(string $context, string $html, ?string $sanitizer = null): string
Пример
Давайте очистим HTML-строку с помощью санитайзера в контексте по умолчанию:
<?php
namespace AppController;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentHtmlSanitizerHtmlSanitizerInterface;
use SymfonyComponentRoutingAttributeRoute;
class SanitizerController extends AbstractController
{
#[Route('/sanitize', name: 'sanitize_index')]
public function index(HtmlSanitizerInterface $sanitizer): Response
{
$html = '<div>hello <script>alert(1)</script></div>';
$res = $sanitizer->sanitizeFor('default', $html);
return new Response($res);
}
}
?>
Результат выполнения кода:
<div>hello </div>
Пример
Давайте очистим HTML-строку в контексте 'empty', который удаляет все теги и оставляет только текст:
<?php
namespace AppController;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentHtmlSanitizerHtmlSanitizerInterface;
use SymfonyComponentRoutingAttributeRoute;
class SanitizerController extends AbstractController
{
#[Route('/sanitize-empty', name: 'sanitize_empty')]
public function emptyContext(HtmlSanitizerInterface $sanitizer): Response
{
$html = '<b>abcde</b> <script>alert(1)</script>';
$res = $sanitizer->sanitizeFor('empty', $html);
return new Response($res);
}
}
?>
Результат выполнения кода:
"abcde "
Пример
Давайте передадим третий параметр - имя санитайзера, определённого в конфигурации:
framework:
html_sanitizer:
sanitizers:
app.article_sanitizer:
allow_safe_elements: true
allow_static_elements: true
allow_relative_links: true
Теперь применим этот санитайзер через метод sanitizeFor:
<?php
namespace AppController;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentHtmlSanitizerHtmlSanitizerInterface;
use SymfonyComponentRoutingAttributeRoute;
class SanitizerController extends AbstractController
{
#[Route('/sanitize-article', name: 'sanitize_article')]
public function article(HtmlSanitizerInterface $sanitizer): Response
{
$html = '<p>article <a href="/user">user</a></p>';
$res = $sanitizer->sanitizeFor('default', $html, 'app.article_sanitizer');
return new Response($res);
}
}
?>
Результат выполнения кода:
<p>article <a href="/user">user</a></p>
Смотрите также
-
класс
HtmlSanitizer,
который очищает HTML-строки от опасного кода -
метод
sanitize,
который очищает HTML без указания контекста -
класс
ExpressionLanguage,
который компилирует и вычисляет выражения -
класс
Yaml,
который парсит и генерирует YAML-строки