入力は数値にキャストされているため、セキュリティ上の問題はありません。パフォーマンスの違いはごくわずかです。ただし、最初の1つは、特定の場合に整数を生成しない場合があります。
たとえば、$input = '19.99';
。
$i = $someString + 0; // $i = 19.99
他の2つのケースは同等ですが、$i = (int) $someString;
平均して。よりも約56%高速です$i = intval($someString);
。どちらも数ミリ秒で実行されるため、かなりのループで発生しない限り、パフォーマンスの違いは一般に無視できます。
$i = (int) $someString; // $i = 9
$i = intval($someString); // $i = 9
セキュリティの問題について:$input
常に特定の形式(たとえば、 #_ xxxx_# )であることが予想される場合は、その形式であることを確認する必要があります。Jackのコメントを拡張— PHP> = 5.2.0を使用している場合は、正規表現を使用して入力の形式を確認できます。
<?php
$input = '1_abcd_1';
// Set the desired format
$filter_options = array(
'options' => array(
// choose a regular expression that matches your format
'regexp' => '/^[\d]_[a-z]{4}_[\d]$/'
)
);
$format = filter_var($input, FILTER_VALIDATE_REGEXP, $filter_options);
if ($format !== false) {
// process input
$someString = substr($format, strripos($format, "_") + 1);
$i = (int) $someString;
echo '$i = ', $i;
} else {
// Handle invalid format
echo 'Malformed data. Potentially malicious';
}
?>
これにより、次のようなものは完全に拒否されます。
0xfe
bob
j_xtyz_5
1_wxyz_22
21_abcd_1
1_Abcd_2
当然、必要に応じて正規表現を調整します。
参照:
PHP> = 5.2.0を使用していない場合は、preg_matchを使用できます。
<?php
$input = '1_abcd_2';
$valid = preg_match('/^[\d]_[a-z]{4}_[\d]$/', $input);
if ($valid) {
// process input
$someString = substr($input, strripos($input, "_") + 1);
$i = (int) $someString;
echo '$i = ', $i;
} else {
// Handle invalid format
echo 'Malformed data. Potentially malicious';
}
?>
入力の形式を検証することで、データが改ざんされているかどうかをすぐに知ることができます。その後、それに応じて行動することができます。