変数のセットが必要な理由
Web アプリケーションにおいて、
ユーザから送られてくる入力データをそのまま利用することは、
悪意あるユーザが送り込む攻撃コードをそのまま利用することにつながり
たいへん危険です。
そこで、Rampart の内部変数にデータをセットすることで、
危険なコードにつながる特殊文字のエスケープや、
想定外の入力データを弾くといった作業が簡単に行えるようになります。
外部からの入力データは、必ず一旦 Rampart に取り込んで
危険性を取り除いた後にご使用ください。
変数のセット
Rampart にデータをセットする方法は以下の通りです。
$ramp->set(key, val);
key が変数名、val が変数に割り当てる値です。
PHP の連想配列のキーと値の関係をイメージして頂けると、
分かりやすいかと思います。
// key1 という変数名に 1 という値をセットする。
$ramp->set("key1", 1);
// key2 という変数名に abc という値をセットする。
$ramp->set("key2", "abc");
set でセットできるのは、文字列と数字だけです。
配列やインスタンス変数はセットできません。
文字数の制限
第三引数に文字数を指定すると、
セットされる値の文字数が指定された文字数以下になるよう、
超過分が切り捨てられます。
$ramp->set(key, val, length);
length は 1 以上を指定してください。
length として 1 未満の値を指定した場合や省略した場合は、
文字数の制限は行われません。
// 次の例では、文字数として 5 が指定されるため、
// "abcdefg" は5文字にカットされ、
// 結果、"key1" にセットされる値は "abcde" になる。
$ramp->set("key1", "abcdefg", 5);
// 次の例では、文字数として 5 が指定されているが、
// "abc" は5文字以下なので、そのままセットされる。
$ramp->set("key2", "abc", 5);
// マルチバイト文字の一文字は1個としてカウントされる。
// 次の例では、"あいうえお" は5文字なので3文字にカットされ、
// 結果、"key3" にセットされる値は "あいう" になる。
$ramp->set("key3", "あいうえお", 3);
// 次の例では、"key4" にセットされる値は "abcあい" になる。
$ramp->set("key4", "abcあいうえお", 5);
内部的には、mb_strlen で文字数をカウントし、
mb_substr で部分文字列を抽出しています。
内部的な処理
set で値をセットしたときに
Rampartによって自動的に施される処理は以下の通りです。
- trim
- 改行コード(\r\n, \n, \r)を"\n"に統一
- 文字コードを setEncoding で指定したものに統一
- ヌルバイトの除去
- 半角カタカナを全角カタカナに変換
- mb_check_encoding により文字エンコーディングの妥当性をチェック
(trim と半角カタカナの変換は、オプションによりスキップ可能です)