入力データへの制限
入力データは FML::Restriction::CGI クラスが提供する正規表現で
検査します。
入力の検査についての概要
投稿
FML::Restriction::CGI クラスによる入力データチェックはありませんが、
FML::Filter クラスによるフィルタチェックがデフォルトで適用されます。
フィルタをはずすには、config.cf で
use_article_body_filter = no
を設定して下さい。
コマンドメール
コマンドメールは FML::Process::Command の中で一行ずつ
FML::Restriction::Command で定義されている正規表現にしたがって
検査されます。検査に合格すれば、
FML::Command::{User,Admin}::コマンド の実行に進むことができます。
CGI
safe_param_ほえほえ() という関数経由でのみ CGI から
データを受けとることができる。
safe_param_XXX() は FML::Restriction::CGI ( FML::Restriction::Base を
継承している)経由でパターンの検査をしています。
makefml
コマンドラインで実行するので、入力チェックなしがデフォルト
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:: でRFC 2822 っていってもねぇ… RFC の定義が広すぎるよね。
FML::Restriction::Command はコマンドのシンタックスチェックはもうちょっ
と粒度を上げるべきなのかもしれない?