入力データへの制限 入力データ(特にコマンドなど)は FML::Restriction::CGI クラスが提供する 正規表現で検査します。 入力の検査についての概要 投稿 FML::Restriction クラスによる入力データチェックはありませんが、 FML::Filter クラスによるフィルタチェックがデフォルトで適用されます。フィ ルタをはずすには、config.cf で use_article_body_filter = no を設定して下さい。 コマンドメール コマンドメールは FML::Process::Command の中で一行ずつ FML::Restriction::Command で定義されている正規表現にしたがって 検査されます。検査に合格すれば、 FML::Command::{User,Admin}::コマンド の実行に進むことができます。 CGI CGI の各プログラムでは、safe_param_ほえほえ() という関数経由でのみデー タを受けとることができます。 safe_param_*() および try_cgi_*() は安全な値を返すことになっています。 FML::Restiction の正規表現でチェックされてた後、返される。 これらの safe_param_XXX() は FML::Restriction::CGI ( FML::Restriction::Base を継承している)経由でパターンの検査をしています。 makefml および fml コマンドラインで実行するので、「入力チェックなし」がデフォルトです。 そのシェルが取れる時点で認証されているはずなので、 正しいユーザ/そのユーザのすることは正しいと信じています。 もちろん、各モジュールごとの制限は受けます。 たとえば、adduser でアドレスを追加しようとしても、 アドレスに見えないような文字列を入れれば拒否されます。 このあたりの制限は各モジュール依存です。 FML::Restriction クラス 入力データや、 コマンドの ACL は FML::Restriction クラス以下にモジュールを配置することにしています。 例えば、CGI では FML::Restriction::CGI クラスのモジュールを用いて 入力データがある正規表現の中に収まるかどうか?の検査をしています。 FML::Restriction 以下では Base を継承していますが、他のモジュールでは、 FML::Restriction クラスを object composition して使って下さい。例えば、 use FML::Restriction::CGI; $safe = new FML::Restriction::CGI; my $allowed_regexp = $safe->param_regexp(); if ($value =~ /^$allowed_regexp{$key}$) { ... ok, do something ... ;} のように使います。 CGI における入力データの制限 CGI では FML::Restriction::CGI クラスのモジュールを用いて 入力データがある正規表現の中に収まるかどうか?の検査をします。 入力値は、前述のクラスの入力制限をうけるべきです。 そのため、直接 param() を使ってはいけません。 必ず safe_param_xxx() メソッドを通じて、 param() ( CGI モジュール )からのデータ入力をして下さい。 なお、入力されたキーワード一覧を調べるために、 for my $dirty_buf (param()) { ... check ... } のような構文は許す必要はあるでしょうが、 param($dirtty_buf) などとはしてはいけません。必ず for my $key (param()) { ... check ... if (key eq $key) { value = safe_param_key() } } のように書いて下さい。 議論; FML::Restriction の制限はきびし過ぎる? FML::Restriction のクラスでは RFC などで許されている表現のごく一部だけ を許しています。 RFC の定義が広すぎるんで…手抜きといえば手抜きといわれちゃいますが、 安全側に倒しています。 FML::Restriction::Command はコマンドのシンタックスチェックはもうちょっ と粒度を上げるべきなのかもしれませんが、現状ではしていません。