ホームページ > バックエンド開発 > PHPチュートリアル > PHPでの防御プログラミングのためのその他のヒント

PHPでの防御プログラミングのためのその他のヒント

Jennifer Aniston
リリース: 2025-02-16 10:34:10
オリジナル
1109 人が閲覧しました

堅牢なPHPアプリケーションを構築する:防御プログラミング戦略

この記事では、PHP開発における防御プログラミングの重要性を調査し、アプリケーションの堅牢性と効率を改善するためのいくつかの重要な戦略を提供します。防御プログラミングは、テスト駆動型の開発を避けることではなく、問題が発生する前に潜在的な障害点を予測し、回避することです。

コアポイント:

  • 防御プログラミングは、潜在的な障害点を予測し、発生する前にそれらを回避するための措置を講じるように設計されています。
  • "速い障害、エラーを大声で報告する" は、効果的な防御プログラミング方法です。特にAPIなどの外部システムからのユーザー入力または入力を処理する場合、エラーが早期に表示されて警告する必要があります。
  • 入力の検証、比較での予期しない割り当ての防止、例外処理を試して/キャッチすること、およびデータベーストランザクションは、防御プログラミングの重要な側面です。

防御プログラミングの定義:

防御プログラミングは、簡単に言えば、潜在的な障害ポイントを予測する目的でプログラムすることです。目標は、これらの問題が発生する前に回避することです。

多くの人々は防御的なプログラミングに反対しますが、これは多くの場合、彼らが見る防御的なプログラミング方法のいくつかが原因です。防御プログラミングは、テスト駆動型の開発を避けたり、単に障害を修正する方法と見なされるべきではありません。

「高速失敗」は、防御プログラミングの反対と見なされるべきではありません。どちらも同じカテゴリに属します。プログラムの障害の可能性を予測し、これらの障害を防止または適切に処理しない場合、これらの方法は何ですか?

More Tips for Defensive Programming in PHP

速く速く、エラーを大声で報告します

単純に言うと、「迅速に失敗し、エラーが大声で報告された」とは、エラーが発生すると、できるだけ早く発生し、エラー状態で静かに実行し続けるのではなく、関係者に警告することを意味します。問題。

このメソッドは、スクリプト、モジュール、またはシステムの外側(APIを介して)からのユーザー入力または入力を処理する場合に最も役立ちます。アプリケーションシナリオの1つは、関数に渡された無効な値またはデータ型を確認することです。

一部のプログラマーが「高速障害」メソッドを使用するエラーの1つは、それらを適切に処理する準備をせずにユーザーに例外とエラーを投げるだけです。エラーメッセージに平均的なユーザーが心配または混乱することを望んでいません。さらに重要なことは、悪意のあるユーザーが表示されている情報から何かを学ぶことを望まないことです。ユーザーに有用なメッセージを表示し、エラーを記録し、その例外の結果である必要がある他のタスクを実行します。あなたはただ
function thisTestFunction($testInt) {
    if (!is_int($testInt)) {
        // 执行某些操作
    }
}
ログイン後にコピー
ログイン後にコピー
速い<

の失敗を望んでいません、あなたはまたloud (問題があることを知っている)とセキュリティが必要です(悪い例外処理や例外の完全な欠如があります取り扱いはより多くのセキュリティの問題を引き起こします)。

入力検証

ユーザー入力を安全に検証する方法はたくさんあります。

タイプ変換は、ユーザー入力を「検証」する興味深い方法です。時々それは次のようになります:

function thisTestFunction($testInt) {
    if (!is_int($testInt)) {
        // 执行某些操作
    }
}
ログイン後にコピー
ログイン後にコピー

他の方法を使用してクロスサイトのスクリプト攻撃を避ける代わりに、単にキャプチャ、タイプ変換、および値を割り当てます。これは、予想されるタイプがあり、そのタイプの値が安全である場合にのみ機能します(それ以外の場合は、適切な整数値を確認する必要があります)。このアプローチの問題は(ほとんどの場合)、の入力をチェックしているわけではありませんが、forceがそれが本来あるべきものになることです。これは意図しない結果をもたらす可能性があります。代わりに、より良いアプローチは、を使用して適切な値を確認することです。 filter_input()

現代のPHPでネイティブ
$member->property = (int)$_GET['property'];
ログイン後にコピー
関数を使用することには多くの利点があります。上記の記事またはPHP.NETで詳細をご覧ください。

filter_input

比較の予期しない割り当てを防止します

これは、シンプルで、しばしば守備的なプログラミングの原則です。比較方法に簡単な変更を加えることは、大きな影響を与える可能性があります。次の状況を考慮してください:

これは比較的正常な比較ですよね?しかし、「==」の代わりに「=」を誤って使用するとどうなりますか(または、ほとんどの場合、「==」)?キーボードの指のシンプルなスワイプ?忘れっぽい、多分?突然、あなたの比較は常に、すべての場合に真実です。あなたのIDEがあなたにこれを警告しない限り、あなたがそれを発見するのにどれくらい時間がかかりますか?場合によっては、これはしばらくの間、サイレントエラーになる可能性があります。ただし、これを防ぐための非常に簡単な方法があります。
$member->property = filter_input(INPUT_GET, 'property', FILTER_VALIDATE_INT);

if (false === $member->property) {
  throw new Exception('Property was not an int');
}
ログイン後にコピー

今、誤って等しい符号を使用している場合、エラーは沈黙しません。明らかに、これは頻繁には発生しない可能性があります。テストによって軽減される可能性があり、すべての場合、特に可変性と変動の比較を行う場合は実用的ではありません。しかし、もしあなたが起こる傾向があるなら、これはまだ悪い考えではありません。

if ($member->property == 12345) {
    // 执行很酷的操作
} else {
    // 不执行任何有趣的操作
}
ログイン後にコピー

トライ/キャッチと例外を処理します

Try/Catchステートメントは、PHP開発者の間の別のホットトピックです。まず、私たちが議論していることを簡単に見てみましょう。

防御プログラミングのためのよく知られているツールは、Try/Catchステートメントと例外クラスです。正しく使用すると、エラーをキャッチしてログに記録するのに最適です。優れたプログラマーは、Try/Catchステートメントを使用して、通常のプロセスの中断を引き起こす可能性のあるエラーまたはその他の状況を予測します。これらの例外が発生した場合、適切な方法で処理する必要があります。必要に応じて、アプリケーションのユーザーは、機密情報を漏らすことなく、可能な限り便利な合理的なエラーメッセージを受信する必要があります。アプリケーションの管理者は、詳細なアラートやログを受信する必要があります。未処理または無視された例外は、「エラーを大声で報告する」という提案を無視し、プログラムが自然界で一定期間サイレントエラー状態になることを可能にする可能性があります。これは、関係者にとっては良くありません。

if (12345 == $member->property) {
    // 执行很酷的操作
} else {
    // 不执行任何有趣的操作
}
ログイン後にコピー

business トランザクションは、クエリをグループ化できるようにするデータベースの機能であり、1つのクエリが失敗した場合、すべてのクエリが失敗するようにします。これは酸の実装であり、こちらについて詳しく読むことができます。アイデアは、複数のクエリを1つのプロセスに組み合わせることは、特にクエリが相互依存している場合、より安全で安定したソリューションになる場合があるということです。 PHP開発者は、多くの場合、トランザクションを完全に無視したり、不要であると仮定したりしますが、一部の防御プログラミングは、データベースと対話するときに大いに役立つ可能性があります。この記事では、トランザクションがより深く説明されていますが、要するに、トランザクションでは、MySQLの更新を実行してから、実際の

をコミットする前に結果を確認することができます。 PDOを使用している場合(必要です)、PDOメソッドを使用してトランザクションを開始し、結果をコミットし、ロールバックできます。上記のトランザクションの概要に加えて、この詳細なガイドを通じてさらに研究することができます。

結論

これらはいくつかの一般的なトリックです。明らかに、それぞれにその目的があり、それぞれに適用されないという重要な状況があります。しかし、これらの概念を日常の開発体制に組み込むと、仕事の効率を高めることができます。これは通常、現在PHPを学習している開発者により適したトピックですが、誰にとっても、実践の良いレビューです。

特に新しい開発者にとって、覚えていることが1つしかない場合、防御プログラミングを行う必要があるということです。これは、間違っている可能性があります。それらを適切に処理します。サイレントエラーが発生し続けないでください。すぐに失敗しました。コードをテストします。問題をテストおよび解決する堅牢なアプリケーションを構築し、将来の問題を予測および処理することにより、アプリケーションをより信頼性を高め、舞台裏でより良いユーザーエクスペリエンスを作成するのに役立つことができます。

以上がPHPでの防御プログラミングのためのその他のヒントの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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