Fab*_*pet 8 markdown symfony twig
我正在撰写博客评论包,我想让用户使用Markdown发布一些代码.
我正在使用symfony2,TWIG和KNPMarkdownBundle进行解析
{{ post.content|markdown }}
Run Code Online (Sandbox Code Playgroud)
实际上,内容被很好地降价解析(<code> <p>...)但是如果我的内容中有一些HTML代码,例如:
Some content
``` <script>alert("hello world");</script> ```
Run Code Online (Sandbox Code Playgroud)
代码未转义,我有一条警告消息.有人可以解释我如何处理XSS问题?(foo|raw和foo|escape正在打破解析)
正如@sjagr暗示的那样,你最好编写自己的枝条扩展.曾几何时我遇到过类似的问题,只写了一个简单的扩展来对它进行排序,这非常简单容易.
新TWIG TAG:
{{ post.content|yourNewTag }}
Run Code Online (Sandbox Code Playgroud)
新TWIG扩展类:
namespace Car\BrandBundle\Twig;
class YourNewTagExtension extends \Twig_Extension
{
public function yourNewTagFilter($param)
{
// Escape your content as you wish with some logic and return it
return $escaped;
}
public function getFilters()
{
return array(new \Twig_SimpleFilter('yourNewTag', array($this, 'yourNewTagFilter')));
}
public function getName()
{
return 'yourNewTag_extension';
}
}
Run Code Online (Sandbox Code Playgroud)
配置:
services:
car.twig.yourNewTag_extension:
class: Car\BrandBundle\Twig\YourNewTagExtension
tags:
- { name: twig.extension }
Run Code Online (Sandbox Code Playgroud)
编辑:
枝条:
{% set someContent = '<script>alert("hello world");</script>' %}
{{ someContent|yourNewTag }}
Run Code Online (Sandbox Code Playgroud)
如果您不想转义特定标记,请使用带有strip_tags()函数的allowable_tags标志.
public function yourNewTagFilter($param)
{
$escaped = strip_tags($param);
// Do something else as well if you want
return $escaped;
// This will print alert("hello world"); as output in your webpage
}
Run Code Online (Sandbox Code Playgroud)
我只是碰巧遇到了这个问题,但由于strip_tags不足以保护属性标签中的值,所以我将提交我的答案。
我正在使用HTML Purifier删除所有不需要的 HTML 元素和属性。打开命令控制台并执行以下命令来安装它。
$ composer require ezyang/htmlpurifier "^4.6"
Run Code Online (Sandbox Code Playgroud)
然后你可以创建你自己的 Twig 扩展:
namespace AcmeBundle\Twig;
class HTMLPurifierExtension extends \Twig_Extension
{
public function getFilters()
{
return array(
new \Twig_SimpleFilter('html_purifier', array($this, 'purify'), array('is_safe' => array('html'))),
);
}
public function purify($text)
{
$elements = array(
'p',
'br',
'small',
'strong', 'b',
'em', 'i',
'strike',
'sub', 'sup',
'ins', 'del',
'ol', 'ul', 'li',
'h1', 'h2', 'h3',
'dl', 'dd', 'dt',
'pre', 'code', 'samp', 'kbd',
'q', 'blockquote', 'abbr', 'cite',
'table', 'thead', 'tbody', 'th', 'tr', 'td',
'a[href|target|rel|id]',
'img[src|title|alt|width|height|style]'
);
$config = \HTMLPurifier_Config::createDefault();
$config->set('HTML.Allowed', implode(',', $elements));
$purifier = new \HTMLPurifier($config);
return $purifier->purify($text);
}
public function getName()
{
return 'html_purifier';
}
}
Run Code Online (Sandbox Code Playgroud)
打开services.yml扩展并将其注册为服务:
services:
acme.html_purifier_extension:
class: AcmeBundle\Twig\HTMLPurifierExtension
public: false
tags:
- { name: twig.extension }
Run Code Online (Sandbox Code Playgroud)
现在你可以使用它
{{ post.content|markdown|html_purifier }}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2915 次 |
| 最近记录: |