Symfony 2.7、Twig 和 CKEditor——如何安全地允许某些 HTML 输出?
Symfony 2.7, Twig, and CKEditor -- How to safely allow some HTML output?
所以我正在使用 Symfony 创建一个博客,人们可以在注册时发表评论。我希望人们能够留下或多或少带有 HTML 的丰富评论,您可以使用 CKEditor 的标准包(图像、字体样式、块引用、表格)以及 YouTube 视频插入这些评论。我一直在 Twig 上使用原始过滤器,以允许所有 HTML CKEditor 生成的内容显示在评论中。不幸的是,这允许所有 HTML ... 所以当每个人都可以进入并 post 他们想要的任何东西时,它会导致一个非常不安全的网站。
有没有办法让我既保留 CKEditor 又过滤掉不安全的问题 HTML/Javascript?在过去,我会简单地实现 BB 代码,这将使我完全控制转换为 HTML 的内容,但 CKEditor 直接生成 HTML...
解决这个问题的最佳方法是什么?
如此有效,您想要将一些 HTML 标签和属性列入白名单?如果是这样,最简单的方法是使用 HTML Purifier 之类的东西,它允许您设置允许 HTML 的规则。
如果您决定使用它,如果您通读 documentation ,设置可能会有点复杂,但类似于:
$config = \HTMLPurifier_Config::createDefault();
$config->set('Cache.DefinitionImpl', null);
$config->set('Attr.AllowedFrameTargets', [ '_blank' ]);
$config->set('Attr.AllowedRel', [ 'nofollow' ]);
$config->set('HTML.Allowed', 'h1,h2,h3,h4,h5,h6,p,blockquote,div,hr,img[src|alt],ul,ol,li,br,strong,b,em,i,span,a[href|target|rel],table,thead,tbody,tr,th,td,*[class|style]');
$purifier = new \HTMLPurifier($config);
return $purifier->purify($userEnteredHtml);
这是我在许多项目中使用过的,所有这些都经过了渗透测试,并且对于 XSS 之类的东西都是干净的。
所以我正在使用 Symfony 创建一个博客,人们可以在注册时发表评论。我希望人们能够留下或多或少带有 HTML 的丰富评论,您可以使用 CKEditor 的标准包(图像、字体样式、块引用、表格)以及 YouTube 视频插入这些评论。我一直在 Twig 上使用原始过滤器,以允许所有 HTML CKEditor 生成的内容显示在评论中。不幸的是,这允许所有 HTML ... 所以当每个人都可以进入并 post 他们想要的任何东西时,它会导致一个非常不安全的网站。
有没有办法让我既保留 CKEditor 又过滤掉不安全的问题 HTML/Javascript?在过去,我会简单地实现 BB 代码,这将使我完全控制转换为 HTML 的内容,但 CKEditor 直接生成 HTML...
解决这个问题的最佳方法是什么?
如此有效,您想要将一些 HTML 标签和属性列入白名单?如果是这样,最简单的方法是使用 HTML Purifier 之类的东西,它允许您设置允许 HTML 的规则。
如果您决定使用它,如果您通读 documentation ,设置可能会有点复杂,但类似于:
$config = \HTMLPurifier_Config::createDefault();
$config->set('Cache.DefinitionImpl', null);
$config->set('Attr.AllowedFrameTargets', [ '_blank' ]);
$config->set('Attr.AllowedRel', [ 'nofollow' ]);
$config->set('HTML.Allowed', 'h1,h2,h3,h4,h5,h6,p,blockquote,div,hr,img[src|alt],ul,ol,li,br,strong,b,em,i,span,a[href|target|rel],table,thead,tbody,tr,th,td,*[class|style]');
$purifier = new \HTMLPurifier($config);
return $purifier->purify($userEnteredHtml);
这是我在许多项目中使用过的,所有这些都经过了渗透测试,并且对于 XSS 之类的东西都是干净的。