2010-12-16 4 views
12

은 어떻게 든 있도록 템플릿 툴킷을 구성 할 수 있습니다탈출 HTML

입니다
[% foo | html %] 

, foo에 HTML을 탈출 :

[% foo %] 

은 지금 말할 필요가 무엇입니까? 내가 탈출하지 않으 경우

[% foo | noHtml %] 

: 그리고 같은 다른 일을합니까?

답변

3

Template::Stash을 확장하여 기본 숨김을 만들 수 있으므로 기본적으로 탈출 변수가됩니다.

그건 제가 생각하기에는 좋은 생각이 아닙니다. 기본 동작을 계속 사용하고 혼동을 줄이는 것처럼 사용자 지정 수정을 삼가하는 것이 좋습니다.

+1

커스텀 Template :: Stash는 아마도 충분하지 않을 것입니다.'[% x %]'와'[% y = x %]'는 stash의'get()'메소드를 호출하여'x'를 검색하지만 첫 번째 함수 만 출력을 생성합니다. 숨김은 아마도 "get and print"와 "get"의 차이점을 말해 두 번/삼중/HTML로 인코딩 된 것들로 끝날 것입니다. 아마도 귀찮은 일은 아닙니다. –

+0

TT의 디자인 철학은 기본적으로 사이트 간 스크립팅 공격을 허용하고야만 면도로 충분한 양의 보안 만 허용하는 것입니다. – geira

+0

그래, TT 철학에 적합하기에는 너무 편리 할거야. – jeje

1

최근에이 문제에 대해 약간 시간을 보냈습니다. 여기 내 해결책의 개요입니다.

보안 취약점없이 WWW 클라이언트에 안전하게 쓸 수있는 문자열을 포함하는 HtmlSafe라는 새로운 클래스를 만들었습니다. 아이디어는 HTML 태그를 생성하는 함수가 HtmlSafe 객체를 반환하고 상자에서 나온 변수가 HtmlSafe가 아니라는 것입니다. HtmlSafe를 만드는 것은 무엇이든지 문제의 문자열에 대한 안전성을 보증합니다. 비 HTML 안전 문자열과 HTML 안전 문자열을 연결하면 CGI :: escapeHTML을 통해 비 HTML 안전 문자열을 이스케이프 처리 한 다음 HTML 안전 문자열과 조인 할 수 있습니다. HtmlSafe의 다른 인스턴스를 HtmlSafe에 연결하면 이스케이프 처리없이 문제의 문자열을 조인 할 수 있습니다. 내가 재정의 할 수 있도록 과부하를 사용하여 끝났다. HtmlSafe 클래스의 연산자입니다. 이 일에

무장, 사실은 다음과 같이 HtmlSafe와 연결을 호출 하위이었던 $ 출력 변수를 기능) (A $ 템플레이트> 과정을 주었다

my $output = HtmlSafe->new(""); 
$template->process($vars, sub { $output .= $_[0]; }); 
return $output->unwrap(); # remove HtmlSafe and return underlying string 

우리는 거의 준비 HtmlSafe TT2와 함께 내가 실제로해야만하는 큰 변화는 Template :: Parser가 사용하려고하는 텍스트 블록의 HtmlSafe 인스턴스를 생성하는 데 사용되는 Template :: Directive의 textblock() 함수를 변경하는 것이 었습니다. 단지 일 때문에 이들은, 구문 분석 템플릿의 텍스트 노드에 해당하는 표시 내가 지금처럼 파서했다

package MyDirective; 
use base "Template::Directive"; 
sub textblock { my $self = shift; return "$Template::Directive::OUTPUT HtmlSafe->new(" . $self->text(@_) . ")"; } 

:

이 외에도
my $parser = Template::Parser->new({ 
    FACTORY => "MyDirective", 
}); 

, 나는 "없음"필터를 정의 TT2의 경우 단순히 HtmlSafe로 정의 된 모든 것을 래핑하므로 원시 HTML을 출력 할 수 있습니다. 이렇게하면 도망 가지 않습니다. 기본 'html'필터는 no-op입니다. HtmlSafe에 연결 한 항목이 이제는 어쨌든 이스케이프 처리되기 때문입니다.