背景、概要
SQL インジェクションが蔓延する数年前、文字列を整数に変換することは、すでにすべての Web プログラムに必要な操作としてリストされていました。 Web プログラムは、get または post からの ID、整数、その他の値を変換関数を通じて強制的に整数に変換し、危険な文字を除外し、システム自体が SQL によって挿入される可能性を最小限に抑えます。
現在、SQL インジェクションは徐々に歴史の舞台から消えていきましたが、Web プログラムの正常な動作を保証し、エラーの可能性を減らし、ユーザーの満足度を高めるためには、ユーザーからの誤った入力を何に変換する必要もあります。が必要です。
変換メソッド
PHPでは文字列を整数に変換するために3つのメソッドを使用できます。
1. 強制型変換方法
強制型変換方法とは、「変換する変数の前に括弧で囲った対象の型を追加する」方法です(PHPマニュアル「型のコツ」より抜粋)。
コードをコピーします コードは次のとおりです:
$foo = "1"; // $foo は文字列型です
$bar = (int)$foo; bar is an integer Type
?>
整数型の場合、キャスト型名は int または integer です。
2. 組み込み関数メソッド
組み込み関数メソッドは、PHP の組み込み関数 intval を使用して変数を変換します。
コードをコピーします コードは次のとおりです:
$foo = "1" // $foo は文字列型です
$bar = intval($foo); $bar は整数型
?>
intval 関数の形式は次のとおりです:
int intval(mixed $var [, int $base]); (PHP マニュアルより抜粋)
PHP マニュアルですがintval() は配列とオブジェクト間の変換には使用できないことを明確に示しています。しかし、テストした結果、配列を変換するときに問題は発生しません。変換された値は予想どおり 0 ではなく 1 です。 PHP 内では、配列型変数もゼロ以外の値を持つとみなされるためだと思います。オブジェクトを変換するとき、PHP は次の通知を出します:
クラス xxxx のオブジェクトは、xxxxx.php の xx 行目で int に変換できませんでした
変換値も 1 です。
3. フォーマット文字列メソッド フォーマット文字列メソッドは、型変換の目的を達成するために、sprintf の %d を使用して、指定された変数をフォーマットします。
コードをコピーします コードは次のとおりです:
$foo = "1" // $foo は文字列型です
$bar = sprintf("%d", $ foo); / / $bar は文字列型です
?>
厳密に言えば、sprintf の変換結果は依然として文字列型であるため、文字列を整数に変換する方法とはみなされません。しかし、彼の処理後の文字列値は確かに「強制的に文字列型に変換された整数」になっています。
実際のテスト
以上、PHPで文字列を整数に変換する3つの方法を紹介しました。普通のプログラマの場合はここまでです。次の部分は異常なプログラマ向けです。
1. 基本的な関数のテスト
次の配列を設定します:
コードをコピーします コードは次のとおりです:
$a[] = "1"; ] = "a1";
$a[] = "1a2";
$a[] = 配列('4',2) ;
$a [] = "2.3";
$a[] = new Directory()?> 配列内の要素を変換する上記の順序で変換ステータスを確認してください。プログラムのソースコードは次のとおりです:
コードをコピーします
コードは次のとおりです:
$a[] = "1";
$a[] = "a1"; $a[] = " 1a"; $a[] = "0"; $a[] = 配列('4',2); = "2.3";
print "(int)
"; $v として)
{
var_dump((int)$v);
print "
"
}
// intval();
"; ($a として $v)
{
var_dump(intval($v));
print "
"
}
// sprintf
print "sprintf();
"; ;
foreach($a as $v)
var_dump("%d", $v));
print "
"
?>
プログラムの最終的な実行結果は次のとおりです(オブジェクトの変換時に表示される通知は削除されています):
(int)
int(1)
int(0)
int(1)
int(1)
int(0)
int( 1)
int(2)
int(-1)
int(1)
intval();
int(0)
int(1)
int(2)
int(-1)
int(1)
sprintf();
string(1) "1"
string(1) "0"
string( 1) "1"
文字列(1) "1"
文字列(1) "0"
文字列(1) "1"
文字列(1) "2"
文字列(2) "-1"
文字列(1) ) "1"
したがって、 3 つの変換の結果はまったく同じであることがわかります。したがって、機能の観点から見ると、3 つのメソッドはすべて変換作業が可能であるため、次のステップはどれがより効率的であるかを確認することです。
2. パフォーマンステスト
テストされた文字列は、注入作業で使用できるものです:
コードをコピー
コードは次のとおりです: $foo = "1 '; * ...";
?> を選択して PHP 5 の動作を複製します
*/
function microtime_float()
{
list($usec, $sec) =explode(" ", microtime());
return ((float )$usec + (float)$sec) ;
}
?>
(PHPマニュアルのmicrotime()関数セクションより抜粋)
テストプロセスは、変数$fooを1,000,000に変換することです。エラーをできるだけ減らすため、合計 3 セットのテストを実行します。テストプログラムは次のとおりです:
コードをコピーします
コードは次のとおりです:
function microtime_float()
{
list($usec, $sec) =explode(" " , microtime()); return ((float)$usec + (float)$sec); $foo = "1';Select * ..."; microtime_float(); for( $i=0;$i{
$bar = (int)$foo;
$fEnd = microtime_float(); . ($fEnd - $fStart ) . "s
";
// intval()
$fStart = microtime_float();
$bar = intval($ foo);
$fEnd = microtime_float();
print "intval():" . "s
"; ()
$fStart = microtime_float ();
for($i=0;$i{
$bar = sprintf("%d", $foo);
$fEnd = microtime_float ();
print "sprintf ():" . ($fEnd - $fStart)
最終テスト結果:
(int):0.67205619812012s ):1.1603000164032s
sprintf():2.1068270206451s
(int):0.66051411628723s
intval():1.1493890285492s
sprintf():2.100823879241 9s
(int):0.66878795623779 s
intval():1.1613430976868s
sprintf() :2.0976209640503s
ただし、このテストは少し倒錯しています(整数を連続して 100 万回変換する人がいるでしょうか? ) ですが、キャストを使用して文字列を整数に変換するのが最も速いことがわかります。
まとめ
強制型変換を使用して文字列を整数に変換することは、最も直接的な変換方法の 1 つです (整数変数の値を直接取得できます)。コードの可読性の観点から見ると、sprintf メソッドのコードは比較的長く、結果として再度強制型変換が必要になる場合があります。intval 関数は典型的なプロセス指向の変換であり、強制型変換の考え方はより直接的です。読者に「変容」が伝わります。効率の観点から見ると、強制型変換は最速の変換方法でもあります。したがって、変換作業を頻繁に行うプログラマーにはこの方法をお勧めします。
http://www.bkjia.com/PHPjc/325067.html
www.bkjia.com
true
http://www.bkjia.com/PHPjc/325067.html
技術記事
背景と概要 SQL インジェクションが蔓延する数年前には、文字列を整数に変換することは、すべての Web プログラムで必要な操作としてすでにリストされていました。 Web プログラムは、ID、整数、その他の値を get または post から強制的に取得します...