我在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">
这就是我想要的,这里的任何人都知道为什么吗?!
答案 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">