PHPプログラマーは現在、ますます重要なタスクを引き受けるようになっています。 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>
これは、ユーザーがすべて正しく入力したことを保証しない限り、明らかなセキュリティ リスクです。
修正方法:
「< この作業を実行する必要があります。」
正しい方法:
<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 入力を無視しないでください
これについては、「The Simplest」という記事で説明しました。 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>?> </p> <p><strong>3. エラー HTTP ヘッダー関連関数を使用してください: header()、session_start()、setcookie()<br></strong></p> <p>この警告に遭遇したことがありますか?」 警告: ヘッダー情報を追加できません - ヘッダーはすでに送信されました [....] </p> <p>毎回 サーバーから Web ページをダウンロードするたびに、サーバーの出力はヘッダーと本文の 2 つの部分に分割されます。 </p> <p>ヘッダーには Cookie などの非視覚データが含まれています。常に頭が最初に到着します。テキスト部分には、ビジュアル HTML、画像、その他のデータが含まれます。 </p> <p>output_buffering が Off に設定されている場合、出力がある前にすべての HTTP ヘッダー関連関数を呼び出す必要があります。問題は、ある環境で開発し、別の環境にデプロイすると、output_buffering 設定が異なる可能性があることです。その結果、リダイレクトが停止し、Cookie とセッションが正しく設定されませんでした。 </p> <p>修正方法: </p> <p>出力する前に必ず http ヘッダー関連関数を呼び出し、output_buffering = Off に設定してください。 </p> <p><strong>4. ファイルに安全でないデータを使用することを要求するか、含める <br></strong></p> <p> 繰り返しになりますが、明示的に宣言していないデータは信頼しないでください。 $_GET、$_POST、または $_COOKIE から取得したファイルを含めたり、要求したりしないでください。 </p> <p>例:</p> <pre class="brush:php;toolbar:false"><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 の出力が含まれていますハッカーはスパムを送信したり、パスワードを変更したり、ファイルを削除したりする可能性があります。想像できるものなら何でも。
修正方法:
どのファイルを 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 のコアには多くの関数が含まれています。多くのプログラマーは何度も車輪の再発明を繰り返します。多くの時間が無駄になりました。コーディングする前に PHP mamual を検索して Google で検索すると新しい発見があるかもしれません。 PHP の exec() は、cmd シェルを実行し、実行結果の最後の行を文字列の形式で返すことができる強力な関数です。セキュリティを考慮して、EscapeShellCmd()
9を使用できます。PHPの古いバージョンを使用してください。 很多程序员还在使用PHP4,在PHP4上开发不能充分发挥PHP的潜能,还存在一些安全的隐患。转到PHP5上来吧,并不费很多功夫。大部分PHP4程序只要改动很少的语句甚至无需改动就可以迁移到PHP5上来。根据http://www.nexen.net的调查 10.对引号做两次转意 见过网页中出现’或’”吗?这通常是因为在开发者的环境中magic_quotes设置为off,而在部署的服务器上magic_quotes=on. PHP会在 GET, POST 和COOKIE中的数据上重复运行addslashes() 。 原始文本: 还有一种情况就是,用户一开始输入了错误的登录信息,服务器检测到错误输入后,输出同样的form要求用户再次输入,导致用户的输入转意两次! 希望通过以上内容介绍的十方面,能够给你打击来帮助。
只有12%的PHP服务器使用PHP5,所以有88%的PHP开发者还在使用PHP4.<ol class="dp-xml">
<li class="alt"><span><span>It’s a string </span></span></li>
<li><span>magic quotes on: </span></li>
<li class="alt"><span>It’s a string </span></li>
<li><span>又运行一次 </span></li>
<li class="alt"><span>addslashes(): </span></li>
<li><span>It\’s a string </span></li>
<li class="alt"><span>HTML输出: </span></li>
<li><span>It’s a string </span></li>
</ol>