2

我在 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">我想要的,这里有人知道为什么吗?!

4

2 回答 2

2

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

解决此问题的最简洁方法是将有效协议列表扩展为 include 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 的每个组件的原因。

于 2013-07-18T16:56:49.267 回答
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">
于 2013-07-18T16:38:22.103 回答