Perl/template-toolkitメモ
提供: 初心者エンジニアの簡易メモ
perl-template-toolkitのインストール
- http://www.cpan.org/
- all modules (a long list)
- Template-Toolkit-2.19.tar.gzをダウンロード
- Template-Toolkit-2.19.tar.gzを解凍して
lib/template.pm lib/template [dir]
を
usr/lib/へコピー
helloworld
index.cgi
#!/usr/bin/perl print "Content-Type: text/html\n\n"; use Template; my $template = Template->new({ INCLUDE_PATH => './' }); my $vars = { test1 => '1', test2 => '0' }; $template->process('test.tmpl', $vars ) || die $template->error(), "\n";
test.tmpl
[% test1 %] [% test2 %]
より高度
index2.cgi
#!/usr/bin/perl print "Content-Type: text/html\n\n"; use Template; #my $template = Template->new({ INCLUDE_PATH => './' }); #my $template = Template->new({ INCLUDE_PATH => './' ,ABSOLUTE => 1 ,RELATIVE => 1}); my $template = Template->new({ INCLUDE_PATH => './' ,ABSOLUTE => 1 ,RELATIVE => 1}); #my $template = Template->new(); #my $vars = { test1 => 'a', test2 => 'b' , html=>{ title => "title1"} }; @arr = ("for1","for2","for3"); @arr2 = ({"temp"=>1},{"temp"=>2},{"temp"=>3}); %hash = ("id"=>1,"data"=>2); my %temp; $temp{test1} = "a"; $temp{test2} = "b"; $temp{html}{title} = "title1"; $temp{html}{body} = "body1"; $temp{for} = \@arr; $temp{for2} = \@arr2; $temp{hash} = \%hash; $vars = \%temp; use Data::Dumper; print Dumper($vars); $template->process('test2.tmpl', $vars ) || die $template->error(), "\n";
test2.tmpl
<br> <br> [% test1 %]<br> [% test2 %]<br> [% html.title %]<br> [% html.body %]<br> <br> [% FOREACH value IN for %] [% value %]<br> [% END %] <br> [% FOREACH value IN for2 %] [% value.key %] [% value.temp %]<br> [% END %] <br> [% FOREACH u IN hash %] [% u.key %] [% u.value %]<br> [% END %] <br>
2chログ
toolkitはセキュリティに弱い?
791 :nobodyさん:2008/01/21(月) 22:33:12 ID:MggCWroJ toolkitについての質問です。 toolkitのテンプレートを利用ユーザに編集させてたいと思っているのですが、 [% myheader = 'my/index.cgi' %] [% INCLUDE myheader %] などされるとソースが見えてしまいます。 なんとか規制できないでしょうか? phpのsmartyであれば以下のように、テンプレートからのインクルードを規制することができます。 同等の機能はあるのでしょうか? $this->security = true; $this->security_settings["INCCLUDE_ANY"] = false; $this->security_dir = "/path/to/templates"; $this->trustes_dir = "/path/to/php"; または、テンプレート内で使える関数を指定できるとかありますでしょうか? 日本語マニュアル見てみましたが、それらしいものがありませんでした。 http://www.hakoniwa.net/tt/ 794 :nobodyさん:2008/01/22(火) 09:20:05 ID:??? >>791 INCLUDE自体を抑制するやり方はわからんが、 If a BLOCK definition is not currently visible then the template name should be a file relative to one of the INCLUDE_PATH directo- ries, or an absolute or relative file name if the ABSOLUTE/RELATIVE options are appropriately enabled. これを利用すれば普通は十分じゃねーの? 795 :nobodyさん:2008/01/22(火) 10:10:27 ID:??? テンプレート編集自体はtoolkit使うわけじゃないだろ? そこでチェックすりゃいいんじゃね? 796 :791:2008/01/23(水) 00:37:55 ID:fM6ljyqY >>794 >もし、ブロック定義が見つからない場合は、テンプレート名はINCLUDE_PATHのディレクトリにあるファイルか、ABSOLUTE/RELATIVEオプションが付いていれば絶対/相対パスにあるファイルを対象とします。 とのことですが、相対・絶対でスクリプト指定できてしまうということですよね? 考えても理解できませんでした、具体的にどのように利用すれば大丈夫なんでしょうか? >>795 たしかにテンプレート編集時にinclude等、使わせたくない文言を削除する方法もあるのですが、 (今後のシステム拡張等も含んで)チェックミスが出てきやすい作りで作るのはあまり好ましくないと考えています。 html-templateでも、includeなど規制する機能はなさそうですし・・・。 使いたい機能はifとloopだけなんですけど、 perlでセキュリティ完備したテンプレートエンジンほかにあるのでしょうか? 797 :nobodyさん:2008/01/23(水) 09:55:40 ID:??? >>796 HTML::Template には no_includes ってオプションがあるけど? 798 :nobodyさん:2008/01/23(水) 10:07:27 ID:??? INCLUDE_PATH以下に見られちゃいけないファイル置かないという選択肢はないの? 800 :nobodyさん:2008/01/23(水) 11:28:58 ID:??? INCLUDE_PATHに関数渡すと・・・ 801 :nobodyさん:2008/01/23(水) 11:58:33 ID:??? >>796 http://anond.hatelabo.jp/20071030153111