symfony - Twig: Allow HTML, but escape script -
i investigating possible xss attack vector application.
what have:
- formtype single
textareafield. field can containhtmltags. twigtemplate renders data inserted.
i use form insert following content:
<b>some valid html text</b> <script type="text/javascript">alert("xss")</script> viewing data require escaping. familiar few strategies when comes escaping data.
1) raw filter: disables escaping -> introduces possible xss
2) e filter:
htmlflavor outputs:<b>some valid html text</b> <script type="text/javascript">alert("xss")</script>jsflavor outputs:\x3cb\x3esome\x20valid\x20html\x20text\x3c\x2fb\x3e\x0d\x0a\x3cscript\x20type\x3d\x22text\x2fjavascript\x22\x3ealert\x28\x22xss\x22\x29\x3c\x2fscript\x3e
3) {{ var|striptags('<br>')|raw }}, outputs: some valid html text alert("xss")
this 1 works, somehow don't it. rather looking black-list solution, not white-list.
now question:
is there other escaping strategy allows html tags escapes <script> tag e("js") filter does?
should "kill" script during form submission or during twig rendering?
i suggest adding new twig filter fits needs.
it should
{{var | filter_black_listed() }} and in filter logic add
class filterblacklistedextension extends \twig_extension { private $blacklistedtags = ['script', 'p']; public function getfilters() { return array( new \twig_simplefilter('filter_black_listed', array($this, 'htmlfilter')), ); } public function htmlfilter($html) { foreach ($this->blacklistedtags $tag) { preg_replace('/(<' . $tag . '>)(.*)(<\/' . $tag . '>)/g', '', $html); } return $html; // maybe apply raw filter afterwards. } public function getname() { return 'filter_black_listed_extension'; } } let me know if don't manage make work :)
Comments
Post a Comment