変数の型指定セット
たとえば、年齢データや注文個数データなど、
仕様上、必ず数値データしか取らないと決まっている変数があるとします。
そうした場合、外部から受け取った入力データを
数値データに「変換」してセットすることで、
もし悪意あるユーザが攻撃コードを送ってきたとしても
コードが数値データに「変換」されるため、
確実に危険なコードを除去することが可能です。
Rampart では、その変数が取りうる値の型・種類が明らかな場合は、
それを明示的に指定して変数をセットすることが可能です。
型を指定した変数のセットは、最も効果的なセキュリティ対策となります。
ぜひ、可能な限りご使用ください。
ブール値のセット
値が true, false のブール値である場合、setBoolean を使用します。
$ramp->setBoolean(key, val);
val はブール値にキャストされ、key にセットされます。
// 次の例では、0 は
キャストのルールは、"false" を除いて、
// ブール値にキャストすると false なので、
// key1 の値として false がセットされる。
$ramp->setBoolean("key1", 0);
// 次の例では、"abc" は
// ブール値にキャストすると true なので、
// key2 の値として true がセットされる。
$ramp->setBoolean("key2", "abc");
// 文字列は通常 true にキャストされるが、
// "false" は例外的に false にキャストされる。
// したがって、key3 の値として true がセットされる。
$ramp->setBoolean("key3", "false");
通常の PHP のキャストと同じです。
int 値のセット、float 値のセット
値が int(整数)値である場合、setInt を使用します。
値が float(浮動小数点)値である場合、setFloat を使用します。
$ramp->setInt(key1, val1);
val1 は int 値にキャストされ、key1 にセットされます。
$ramp->setFloat(key2, val2);
val2 は float 値にキャストされ、key2 にセットされます。
// 次の例では、文字列 "123" は
キャストのルールは、通常の PHP のキャストと同じです。
// int 値 / float 値にキャストされ、
// key1 の値として数値データ 123 がセットされる。
$ramp->setInt("key1", "123");
$ramp->setFloat("key1", "123");
// 次の例では、"abc" は
// int 値 / float 値にキャストすると 0 なので、
// key2 の値として 0 がセットされる。
$ramp->setInt("key2", "abc");
$ramp->setFloat("key2", "abc");
// 次の例では、"12.3" は
// int 値にキャストすると 12 なので、
// key3 の値として 12 がセットされる。
$ramp->setInt("key3", "12.3");
// 次の例では、"12.3" は
// float 値にキャストすると 12.3 なので、
// key3 の値として 12.3 がセットされる。
$ramp->setFloat("key3", "12.3");
特定の文字列のセット
値が [0-9](数字)で構成される文字列である場合、
setNumber を使用します。
値が [0-9a-zA-Z](英数字)で構成される文字列である場合、
setAlphanum を使用します。
値が [0-9a-zA-Z_-](英数字, アンダーバー, ハイフン)で
構成される文字列である場合、setWord を使用します。
$ramp->setNumber(key, val);
val に許可されている文字以外が含まれる場合は除去され、
$ramp->setAlphanum(key, val);
$ramp->setWord(key, val);
key にセットされます。
// 次の例では、"abc-123+DEF" の数字以外が除去され
// key1 の値として "123" がセットされる。
$ramp->setNumber("key1", "abc-123+DEF");
// 次の例では、"abc-123+DEF" の英数字以外が除去され
// key2 の値として "abc123DEF" がセットされる。
$ramp->setAlphanum("key2", "abc-123+DEF");
// 次の例では、"abc-123+DEF" の
// 「英数字, アンダーバー, ハイフン」以外が除去され
// key2 の値として "abc-123DEF" がセットされる。
$ramp->setWord("key3", "abc-123+DEF");
setInt と setNumber の違いは、
前者は数値に変換されるのに対して、後者は文字列である点。
// 次の例では、"-1" は int 値にキャストされ
// key1 の値として -1 がセットされる。
$ramp->setInt("key1", "-1");
// 次の例では、"-1" の数字以外が除去され
// key2 の値として "1" がセットされる。
$ramp->setNumber("key2", "-1");
// 次の例では、"001" は int 値にキャストされ
// key3 の値として 1 がセットされる。
$ramp->setInt("key3", "001");
// 次の例では、key4 の値として "001" がセットされる。
$ramp->setNumber("key4", "001");
// 次の例では、"abc" は int 値にキャストされ
// key5 の値として 0 がセットされる。
$ramp->setInt("key5", "abc");
// 次の例では、"abc" の数字以外が除去され
// key6 の値として "" がセットされる。
$ramp->setNumber("key6", "abc");
文字数の制限
set 同様、第三引数に文字数を指定することができます。
ただし、setBoolean は文字数を指定しても意味がないため、
文字数の制限機能はありません。
$ramp->setInt(key, val, length);
$ramp->setFloat(key, val, length);
$ramp->setNumber(key, val, length);
$ramp->setAlphanum(key, val, length);
$ramp->setWord(key, val, length);
マルチバイト文字の変換
ここで挙げたメソッドはすべて、
"val" でセットされるデータに全角の英数字が含まれている場合には
半角に変換した後にそれぞれの処理を行います。
// 次の例では、"ABC123" はまず半角 "ABC123" に変換され、
// その後int値にキャストされる。
// したがって、key の値として 123 がセットされる。
$ramp->setInt("key1", "ABC123");