2013-07-18 4 views
2

Я написал фильтр, как это в Perlнужна помощь в HTML :: tagFilter

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

Вам нужно установить 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"> 
+0

Ваш ответ сработал отлично –

2

Причина ваш атрибут src не передается через из-за защиты сценариев межсайтовому модуля. Значение cid:img.png отклоняется как недопустимый URL-адрес, поэтому атрибут удаляется.

tidiest способ обойти это, чтобы расширить список допустимых протоколов включить 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.

+0

ваш ответ работал отлично –

Смежные вопросы