在html :: tagFilter中需要帮助

时间:2013-07-18 16:19:19

标签: perl html-parsing

我在perl

中写了一个这样的过滤器
my $tf = HTML::TagFilter->new(
            allow => {
                img => { src => [] },
                b   => { all => [] },
                i   => { all => [] },
                em  => { all => [] },
                u   => { all => [] },
                s   => { all => [] }
            }
        );

$message_body = $tf->filter($message_body);

现在我需要从这个过滤器做的是允许给定标签,并且img允许src属性。代码提供了很好的结果,除了像<img src="cid:img.png" alt="Smiley face">这样的标记,它只返回<img>而不是<img src="sid:imp.png">这就是我想要的,这里的任何人都知道为什么吗?!

2 个答案:

答案 0 :(得分:2)

您的src属性未被传递的原因是该模块的跨站点脚本保护。值cid:img.png被拒绝为无效网址,因此该属性将被删除。

解决此问题的最简单方法是将有效协议列表扩展为包含cid,如下所示:

my @protocols = $tf->xss_permitted_protocols;
push @protocols, 'cid';
$tf->xss_permitted_protocols(@protocols);

$message_body = $tf->filter($message_body);

如果在创建log_rejects => 1对象时设置HTML::TagFilter,则可以检查$tf->report返回的值,以查看模块拒绝HTML的每个组件的原因。

答案 1 :(得分:0)

您需要将skip_xss_protection设置为1:

#!/usr/bin/perl

use strict;
use warnings;
use HTML::TagFilter;

my $tf = HTML::TagFilter->new(
            allow => {
                img => {src => []},
                b   => { all => [] },
                i   => { all => [] },
                em  => { all => [] },
                u   => { all => [] },
                s   => { all => [] }
            },
            skip_xss_protection => 1,
        );

my $html = qq{<img src="cid:img.png" alt="Smiley face">};

$html = $tf->filter($html);
print $html;

打印:

<img src="cid:img.png">