変数の型指定セット

たとえば、年齢データや注文個数データなど、
仕様上、必ず数値データしか取らないと決まっている変数があるとします。

そうした場合、外部から受け取った入力データを
数値データに「変換」してセットすることで、
もし悪意あるユーザが攻撃コードを送ってきたとしても
コードが数値データに「変換」されるため、
確実に危険なコードを除去することが可能です。

Rampart では、その変数が取りうる値の型・種類が明らかな場合は、
それを明示的に指定して変数をセットすることが可能です。

型を指定した変数のセットは、最も効果的なセキュリティ対策となります。
ぜひ、可能な限りご使用ください。

ブール値のセット

値が true, false のブール値である場合、setBoolean を使用します。

$ramp->setBoolean(key, val); val はブール値にキャストされ、key にセットされます。

// 次の例では、0 は
// ブール値にキャストすると false なので、
// key1 の値として false がセットされる。

$ramp->setBoolean("key1", 0);

// 次の例では、"abc" は
// ブール値にキャストすると true なので、
// key2 の値として true がセットされる。

$ramp->setBoolean("key2", "abc");

// 文字列は通常 true にキャストされるが、
// "false" は例外的に false にキャストされる。
// したがって、key3 の値として true がセットされる。

$ramp->setBoolean("key3", "false");
キャストのルールは、"false" を除いて、
通常の PHP のキャストと同じです。

int 値のセット、float 値のセット

値が int(整数)値である場合、setInt を使用します。
値が float(浮動小数点)値である場合、setFloat を使用します。

$ramp->setInt(key1, val1);
$ramp->setFloat(key2, val2);
val1 は int 値にキャストされ、key1 にセットされます。
val2 は float 値にキャストされ、key2 にセットされます。

// 次の例では、文字列 "123" は
// 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");
キャストのルールは、通常の PHP のキャストと同じです。

特定の文字列のセット

値が [0-9](数字)で構成される文字列である場合、
setNumber を使用します。
値が [0-9a-zA-Z](英数字)で構成される文字列である場合、
setAlphanum を使用します。
値が [0-9a-zA-Z_-](英数字, アンダーバー, ハイフン)で
構成される文字列である場合、setWord を使用します。

$ramp->setNumber(key, val);
$ramp->setAlphanum(key, val);
$ramp->setWord(key, val);
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");

setIntsetNumber の違いは、
前者は数値に変換されるのに対して、後者は文字列である点。 // 次の例では、"-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");