ホームページ  >  記事  >  バックエンド開発  >  PHP の開発時に忘れがちな技術的な詳細

PHP の開発時に忘れがちな技術的な詳細

WBOY
WBOYオリジナル
2016-07-29 09:04:13894ブラウズ

開発中、技術的な詳細を忘れてしまう可能性があります。これらの詳細は、Web サイトへのインジェクション、Web サイトのクラッシュなどの重大な結果を引き起こす可能性があります。ここで、遭遇する可能性のある PHP の「罠」をいくつかまとめてみましょう。

トラップ 1: empty()

<&#63;php
//以下代码会直接导致PHP解析错误
$arr1 = [1, 2, 3];
$arr2 = [3, 4];
if(empty(array_diff($arr1, $arr2))) { //解析错误
  echo 'empty';
} else {
  echo 'not empty';
}

最新の公式 Web サイトのマニュアルには、これに関する特別な指示があります:

注:

在 PHP 5.5 之前,empty() 仅支持变量;任何其他东西将会导致一个解析错误。

つまり、次のコードは有効になりません: empty(trim ($name)) 。 代わりに、trim($name) == false を使用する必要があります。私が最後にこのエラーに遭遇したのは、Phalcon で開発していたときでした。最初は、それらを除外した後、不可解に感じました。この行は、empty の誤った使用が原因で発生しました。もちろん、PHP 5.5 以降、empty はこの記述方法をサポートしています。

トラップ 2: in_array()


<&#63;php
//判断数组里是否存在用户所提交的用户 ID
//$post_dirty_id = '1092';
$post_dirty_id = '1092 ORDER BY #1';
$safe_arr = [
  987 => '小明',
  1092 => '汤姆',
  1256 => '奥立升'
];
if(in_array($post_dirty_id, array_keys($safe_arr))) {
  echo 'find me';
} else {
  echo 'do not find me';
}
//输出结果:find me,此结果明显错误

私がこの問題を発見したのは、Web サイトに SQL が挿入されていたためでした。幸いなことに、この問題はテスト中に発見され、深刻な影響はありませんでした。

in_array() 関数の使用に関しては、他にも注意すべき点があります。PHP マニュアルには、この関数の「奇妙な」動作を説明するためにネットユーザーによって提供された多数の例があります。

<&#63;php
 $a = ['a', 32, true, 'x' => 'y'];
 var_dump(in_array(25, $a)); // true, one would expect false
 var_dump(in_array('ggg', $a)); // true, one would expect false
 var_dump(in_array(0, $a)); // true
 var_dump(in_array(null, $a)); // false

安全上の理由から、次の方法で判断することをお勧めします:

<&#63;php
//判断数组里是否存在用户提交的 ID
//$post_dirty_id = '1092';
$post_dirty_id = '1092 ORDER BY #1';
$safe_arr = [
  987 => '小明',
  1092 => '汤姆',
  1256 => '奥立升'
];
if(isset($safe_arr[$post_dirty_id])) {
  echo 'find me';
} else {
  echo 'do not find me';
}
//输出结果:do not find me,这是正确的结果

上記では、PHP を開発する際に忘れがちな技術的な詳細を側面も含めて紹介しました。PHP チュートリアルに興味のある友人に役立つことを願っています。

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