ホームページ  >  記事  >  类库下载  >  PHP の弱い型の安全性の問題

PHP の弱い型の安全性の問題

高洛峰
高洛峰オリジナル
2016-10-10 09:51:501106ブラウズ

1. 型変換の問題

 intval();
 
    var_dump(intval('1asdfasd'));  //1
    var_dump(intval('awqw12'));  //0
    var_dump(intval(array()));    //0
    var_dump(intval(array('foo','val'))); //1
    var_dump(intval(0x1A)); //26  十六进制转换
    var_dump(intval('asdfqwer')); //0

intval 変換された値が文字列の場合はエラーは返されませんが、変換された値が空の場合は 2 つの状況があります。配列の場合は 0 が返され、それ以外の場合は 1 が返されます

注: PHP は 32 ビットのメモリを使用して、符号付きの場合は 4294967296 の数値を表現できます。

2. 組み込み関数の緩みの問題

switch();
 
     $i='3adcd';
     switch($i){
              case 1:
                     echo 'i is 1';
                     break;
              case 2:
                     echo 'i is 2';
                     break;
              case 3:
                     echo 'i is 3';
                     break;
              default:
                    echo 'i is default';
                    break;
     }

上記の結果は switch case 3 に入ります。なぜこのようなことが起こるのでしょうか? switch が数値型の場合、switch は実行時にパラメータを int クラスに変換します。上記では、最初に $i を入力すると、変換結果は 3 になります。 。 。

in_array();
    $arr = [0,1,2,3,'test'];
    var_dump(in_array('abd',$arr));    // true
    var_dump(in_array('1bc',$arr));    // true

なぜ上記の実行結果はこのようになるのでしょうか?後でマニュアルを調べてみると、in_array のデフォルトでは、値が等しいかどうかのみを比較し、型が等しいかどうかは比較しないという公式の記述があります。の値が同じであるため、上記の結果が得られます。この結果に対して、in_array 関数の 3 番目のパラメーターを True に設定すると、厳密な比較方法が得られます。

以上は、日々の開発において注意すべき点です。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

関連記事

続きを見る