facebook twitter hatena line email

Perl/template-toolkitメモ

提供: 初心者エンジニアの簡易メモ
移動: 案内検索

perl-template-toolkitのインストール

  1. http://www.cpan.org/
  2. all modules (a long list)
  3. Template-Toolkit-2.19.tar.gzをダウンロード
  4. 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