背景と概要
SQL インジェクションが蔓延する数年前には、文字列を整数に変換することは、すべての Web プログラムで必要な操作としてすでにリストされていました。 Web プログラムは、get または post からの ID、整数、その他の値を変換関数を通じて強制的に整数に変換し、危険な文字を除外し、システム自体が SQL によって挿入される可能性を最小限に抑えます。
現在、SQL インジェクションは徐々に歴史の舞台から消えていきましたが、Web プログラムの正常な動作を保証し、エラーの可能性を減らし、ユーザーの満足度を高めるためには、ユーザーからの誤った入力も変換する必要があります。私たちの必須のものに。
変換メソッド
PHP では、文字列を整数に変換するために 3 つのメソッドを使用できます。
1. 強制型変換方法
強制型変換方法は「変換対象の変数の前に括弧で囲った対象の型を追加する」です(「型のコツ」より抜粋) PHPマニュアル)の方法です。
コードをコピー コードは次のとおりです。
$foo = "1" / / $foo は文字列型です
$bar = (int)$foo; // $bar は整数型です
?> 整数型の場合はキャスト型名ですint または整数です。
コードは次のとおりです。 $foo = "1" / / $foo は文字列型です
$bar = intval($foo); // $bar は整数型です
?>
関数は:
コードは次のとおりです。 $foo = "1" / / $foo は文字列型です
$bar = sprintf("%d", $foo); // $bar は文字列型です
?> 厳密には、 sprintf 変換結果は依然として文字列型であるため、文字列を整数に変換する方法とみなされるべきではありません。しかし、彼の処理後の文字列値は確かに「強制的に文字列型に変換された整数」になっています。
実際のテスト
上記では、PHP で文字列を整数に変換する 3 つの方法を紹介しました。普通のプログラマの場合はここまでです。次の部分は異常なプログラマの場合です。
1. 基本関数テスト
$a[] = "1"; $a[] = "1a"; >$a[ ] = "1a2"; $a[] = "0";
$a[] = "2.3" ; $a[] = "-1";
$a[] = new Directory();
シーケンス要素に上記で指定された配列を使用して、変換ステータスを確認します。プログラムのソース コードは次のとおりです。
コードをコピー
コードは次のとおりです。
$a[] = 配列('4',2); $a[] = "-1"; 🎜>$a[] = new Directory(); // int print "(int)
"; foreach($a as $v)
var_dump((int )$v);
print "
";
// intval
print "intval();
"; ;
foreach( $a as $v)
{
var_dump(intval($v));
print "
"; sprintf
print " sprintf();
";
foreach($a as $v)
{
var_dump(sprintf("%d", $v));
print "< ;br />"
}
?>
プログラムの最終的な実行結果は次のとおりです (オブジェクトの変換時に表示される通知は削除されています):
(int)
int(1)
int(0)
int (1)
int(1)
int(0)
int(1)
int(2)
int(-1)
int(1)
intval ();
int(1)
int(0)
int(1)
int(1)
int(0)
int(1)
int( 2)
int (-1)
int(1)
sprintf();
string(1) "1"
string(1) "0"
string(1) ) "1"
string(1) "1"
string(1) "0"
string(1) "1"
string(1) "2"
string(2) ) "-1"
string(1) "1"
3 つの変換の結果はまったく同じであることがわかります。したがって、機能の観点から見ると、3 つのメソッドはすべて変換作業が可能であるため、次のステップはどれがより効率的であるかを確認することです。
2. パフォーマンス テスト
テストされた文字列は、注入作業で使用できるものです:
コードをコピーコードは次のとおりです:
$foo = "1';Select * ...";
?>
タイムポイントを取得します。は次のとおりです (消費時間を計算するためにテストの開始点と終了点を取得するために使用されます):
**
* PHP 5 の動作を複製する単純な関数
*/
function microtime_float()
{
list($usec, $sec) =explode(" ", microtime());
return ((float)$usec (float)$sec );
}
?>
コードをコピー コードは次のとおりです。
function microtime_float()
{
list($usec, $sec) =explode(" ", microtime());
return ((float)$usec (float)$sec);
$foo = "1';Select * ...";
// (int)
$fStart = microtime_float(); ;1000000;$i )
{
$bar = (int)$foo;
}
$fEnd = microtime_float(); ($fEnd) - $fStart) . "
// intval()
$fStart = microtime_float()
for($i=0;$i<1000000;$i )
{
$bar($foo);
}
$fEnd = microtime_float();
print "intval():" . s
";
// sprintf()
$fStart = microtime_float();
for($i=0;$i{
$bar = sprintf( "%d", $foo);
}
$fEnd = microtime_float();
print "sprintf():" . ;br />" ;
?>
最終テスト結果:
(int):0.67205619812012s