【问题标题】:Twig: Allow HTML, but escape scriptTwig:允许 HTML,但转义脚本
【发布时间】:2015-08-29 22:33:10
【问题描述】:

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

我有什么:

  • FormType 具有单个 textarea 字段。通常这个字段可以包含html标签。
  • Twig 呈现插入数据的模板。

我使用该表单插入以下内容:

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

查看该数据需要转义。在转义数据方面,我熟悉的策略很少。

1) raw 过滤器:完全禁用转义 -> 引入可能的 XSS

2)e过滤器:

  • html 风味输出:&lt;b&gt;Some valid HTML text&lt;/b&gt; &lt;script type="text/javascript"&gt;alert("XSS")&lt;/script&gt;
  • 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('&lt;br&gt;')|raw }},输出:一些有效的 HTML 文本 alert("XSS")

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

现在的问题是:

是否有任何其他转义策略允许html 标签但像e("js") 过滤器那样转义&lt;script&gt; 标签?

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

【问题讨论】:

    标签: symfony twig html-sanitizing


    【解决方案1】:

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

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

    【讨论】:

    • 是的,我考虑过编写自己的解决方案 :) 但是,问题是,这是否足够安全?
    • 我用谷歌搜索了一下,这似乎“足够安全”:) 谢谢 :)
    • 嘿 pcm!只是想告诉你,我大约一周前才实现了自己的过滤器。工作精美。再次感谢! :)
    • +1 伙计,您可以在 htmlFilter() 中使用更安全且具有更多选项的链接 (github.com/PHPMailer/PHPMailer/blob/master/extras/…)
    • 我不认为这可以防止on-click 和类似属性,但不确定这是否是一个大问题......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-10
    • 2014-12-28
    • 1970-01-01
    • 1970-01-01
    • 2015-03-17
    • 1970-01-01
    相关资源
    最近更新 更多