2

我正在XSS为我的应用程序调查可能的攻击媒介。

我有的:

  • 具有单个textarea字段的 FormType。通常这个字段可以包含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 文本警报(“XSS”)

这个工作,但不知何故我不喜欢它。我宁愿寻找黑名单解决方案,而不是白名单。

现在的问题:

是否有任何其他转义策略允许html标签但<script>e("js")过滤器一样转义标签?

Twig我应该在表单提交期间还是在渲染期间“杀死”脚本?

4

1 回答 1

7

我建议添加一个适合您需求的新 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';
    }
}

如果您无法完成这项工作,请告诉我:)

于 2015-06-14T10:39:01.007 回答