2015-06-14 2 views
2

Я изучаю возможный вектор атаки для своего приложения.Twig: Разрешить HTML-код, но избежать скрипта

Что у меня есть:

  • FormType с одним textarea полем. Обычно это поле может содержать теги html.
  • Twig шаблон, который отображает данные.

Я использую эту форму, чтобы вставить следующее содержание:

<b>Some valid HTML text</b> 
<script type="text/javascript">alert("XSS")</script> 

Просмотр, что данные требуют бы избежать. Я знаком с несколькими стратегиями, когда дело доходит до выхода из данных.

1) raw фильтр: Полностью отключает побег -> вводит возможный Xss

2) e фильтр:

  • html ароматизирующих выходов: <b>Some valid HTML text</b> <script type="text/javascript">alert("XSS")</script>
  • js ароматизирующих выходы: \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 }} , выходы: Некоторые допустимые HTML-текст alert ("XSS")

Это работает, но мне как-то не нравится. Я скорее ищу решение черного списка, а не белый список.

Теперь вопрос:

Есть ли другая спасаясь стратегия, которая позволяет html тегов, но ускользает <script> тега как e("js") фильтра делает?

Должен ли я «убить» скрипт во время отправки формы или во время рендеринга Twig?

ответ

5

Я бы предложил добавить новый фильтр Twig, который соответствует вашим потребностям.

Это должно выглядеть как

{{var | filter_black_listed() }} 

и в логике фильтра вы добавить что-то вроде

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 as $tag) { 
      preg_replace('/(<' . $tag . '>)(.*)(<\/' . $tag . '>)/g', '', $html); 
     } 

     return $html; // maybe even apply the raw filter also afterwards. 
    } 

    public function getName() 
    { 
     return 'filter_black_listed_extension'; 
    } 
} 

дайте мне знать, если вам не удается сделать эту работу :)

+1

Да, я подумывал написать собственное решение :) Но, вопрос в том, достаточно ли это достаточно? –

+0

Я немного поработал в поисковых системах, и это кажется «достаточно безопасным» :) Спасибо :) –

+0

Эй, pcm! Просто хотел сказать вам, что я только реализовал свой собственный фильтр около недели назад. Работает красиво. Еще раз спасибо! :) –

Смежные вопросы