tgalopin / html-sanitizer-bundle
Symfony Bundle for https://github.com/tgalopin/html-sanitizer
Requires
- php: >=7.1
- symfony/framework-bundle: ^3.4|^4.0|^5.0|^6.0
- tgalopin/html-sanitizer: ^1.1
Requires (Dev)
- phpunit/phpunit: ^7.4
- symfony/form: ^4.1|^5.0|^6.0
- symfony/twig-bundle: ^4.1|^5.0|^6.0
- symfony/var-dumper: ^4.1|^5.0|^6.0
README
html-sanitizer是一个库,旨在处理、清理和净化外部用户(您无法信任的用户)发送的HTML,允许您安全地存储和显示它。它提供了明智的默认设置,以提供极佳的开发者体验,同时仍然可以完全配置。
此存储库是一个Symfony包,将html-sanitizer库集成到Symfony应用程序中。它提供了在Symfony中轻松使用净化器的工具。
安装
html-sanitizer-bundle需要PHP 7.1+和Symfony 3.4+。
您可以使用Symfony Flex安装此包
composer require tgalopin/html-sanitizer-bundle
配置
您可以使用html_sanitizer
配置部分配置此包
# config/packages/html_sanitizer.yaml html_sanitizer: default_sanitizer: 'default' sanitizers: default: extensions: ['basic', 'image', 'list'] tags: img: allowed_hosts: ['127.0.0.1', 'mywebsite.com', 'youtube.com'] force_https: true admin_content: extensions: ['basic', 'image', 'list']
如您所见,您可以在应用程序中同时拥有多个可用的净化器。请参阅库文档以了解净化器的所有可用配置选项。
在服务中使用
此包提供配置的净化器,使用HtmlSanitizer\SanitizerInterface
接口进行自动装配。此自动装配将针对在包配置中定义的默认净化器。
这意味着如果您使用自动装配,您可以在任何服务中将SanitizerInterface
类型提示为以获取默认净化器
use HtmlSanitizer\SanitizerInterface; class MyService { private $sanitizer; public function __construct(SanitizerInterface $sanitizer) { $this->sanitizer = $sanitizer; } // ... }
同样适用于控制器
use HtmlSanitizer\SanitizerInterface; class MyController { public function index(SanitizerInterface $sanitizer) { // ... } }
如果您不使用自动装配,您可以手动将html_sanitizer
服务注入到您的服务中,以获取默认净化器。
如果您需要访问服务中的默认净化器以外的其他净化器,您可以
-
通过将配置作为
html_sanitizer.<santizer-name>
(例如,html_sanitizer.admin_content
)注入您的服务配置来注入特定的净化器; -
使用净化器注册表,通过将配置作为
html_sanitizer.registry
注入您的服务配置。它是一个服务定位器,映射所有可用的净化器
use Psr\Container\ContainerInterface; class MyService { public function __construct(ContainerInterface $sanitizers) { // $sanitizers->get('admin_content') ... } }
在表单中使用
此仅适用于您已安装Symfony Form组件的情况。
html-sanitizer的主要用途是与表单结合使用。此包提供了一个TextType扩展,允许您自动净化任何文本字段或基于TextType(TextareaType、SearchType等)的字段的HTML。
要在任何表单中使用它,您可以使用 sanitize_html
选项
class MyFormType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('content', TextareaType::class, ['sanitize_html' => true]) ; } }
要使用除默认之外的清理器,请使用 sanitizer
选项
class MyFormType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('content', TextareaType::class, ['sanitize_html' => true, 'sanitizer' => 'admin_content']) ; } }
在 Twig 中的使用
这仅适用于您已安装 Twig 扩展包的情况。
通过扩展提供了 sanitize_html
Twig 过滤器,让您可以在视图中过滤 HTML。
<div> {{ html|sanitize_html }} </div>
要使用除默认之外的清理器,请向过滤器添加一个参数
<div> {{ html|sanitize_html('admin_content') }} </div>
注册扩展
如果您使用自动配置,实现 HtmlSanitizer\Extension\ExtensionInterface
接口的类将被自动注册,您可以在清理器配置中使用它们
html_sanitizer: default_sanitizer: 'default' sanitizers: default: extensions: ['basic', 'my-extension']
如果您不使用自动配置,您需要将您的扩展作为标记为 html_sanitizer.extension
的服务进行注册
services: app.sanitizer.my_extension: class: 'App\Sanitizer\MyExtension' tags: [{ name: 'html_sanitizer.extension' }]
安全问题
如果您在清理器包或库中发现安全漏洞,请遵循 我们的披露流程。
向后兼容承诺
此库遵循与 Symfony 框架相同的向后兼容承诺:https://symfony.ac.cn/doc/current/contributing/code/bc.html
注意:此库中的许多类要么标记为
@final
,要么标记为@internal
。@internal
类被排除在任何向后兼容承诺之外(您不应在代码中使用它们),而@final
类可以使用,但不应扩展(请使用组合代替)。