Twig:允许 HTML,但转义脚本



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

我有什么:

  • 具有单个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风味输出:x3Cbx3ESomex20validx20HTMLx20textx3Cx2Fbx3Ex0Dx0Ax3Cscriptx20typex3Dx22textx2Fjavascriptx22x3Ealertx28x22XSSx22x29x3Cx2Fscriptx3E

3){{ var|striptags('<br>')|raw }},输出:一些有效的HTML文本警报("XSS")

这个有效,但不知何故我不喜欢它。我正在寻找黑名单解决方案,而不是白名单。

现在的问题:

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

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

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

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

最新更新