先日、成功したスタートアップ企業の技術責任者である友人と何気ない会話をしていました。オリンピックの女子水球決勝を観戦しているときに、私が見つけた PHP の失敗について話し始めました。 ?。彼は技術リーダーであり、私は中間開発者であるため、彼は日常の忙しい中ですでにこの失敗に取り組んでいると予想していましたが、まあ... 思われるかもしれませんが、彼がまだ取り組んでいなかったのは驚くべきことでした。
私が話している「失敗」とは、おそらくすでに推測されているでしょうが、PHP の緩やかな比較にほかなりません。さて、公平を期すために、私はこれを失敗というほどではなく、機能と呼びたいと思いますが、その使用法は非常に危険である可能性があるため、その意味では失敗です。オタクを始めましょう!
PHP における緩い比較は、== 演算子を使用して 2 つの値を比較することです。これは、比較される変数のデータ型をチェックしません。 PHP は、値を比較する前に、値を共通の型に変換しようとします。
if ('string' == true){ echo 'Weedle I choose you'; } else{ echo 'Charizard I choose you'; }
信じられないかもしれませんが、リザードンは未使用のままで、ここで 3 レベルのビードルを戦闘に送り込もうとしています。 なぜ? そうですね、上の例では、PHP は文字列 'string' を true と比較する前に true に変換するため、真の比較が行われます。この動作は便利な場合もありますが、適切に理解して制御しないと危険になる可能性があります。
詳細については、PHP ドキュメントのこの大まかな比較表を確認してください
最初はそれほど大したことではないように思えるかもしれませんが、訓練を受けた開発者の目には信じてください、この突然のトリックは骨の髄まで震えて、本番コードのリファクタリングの連続になるかもしれません。
記事のこのセクションでは、野生で見つかった場合に多額のバグ報奨金が得られるコード ブロックをいくつか紹介します。また、コードベースに似たものを見つけた場合は変更してください。 ?
以下のスニペットには、非常に基本的なログイン システム ロジックが表示されます。
$username = $_POST['username']; $password = $_POST['password']; if ($username == 'admin' && $password == '12345') { // Grant access }
狡猾なハッカーが送信されたデータを改ざんし、$_POST['username'] = true および $_POST['password'] = true にし、結果は次のようになるとします。
$username = $_POST['username']; $password = $_POST['password']; if (true == 'admin' && true == '12345') { // Grant access } # Now that hacker has been granted access to our App... Good for him, not for us
ハッカーがどのようにして私たちのデータを改ざんできるのか疑問に思っているなら、私は頭から 2 つの答えを用意しています:
次に進みます。
ここでは、ショックを受けるかもしれない PHP の問題を紹介します。
$user_role = $_POST['user_role']; // Example: 'admin', 'editor', 'viewer' // Authorization check using a switch statement switch ($user_role) { case 'crazyDifficultAdminRoleNooneWouldEverGuess': // Admin privileges echo "Access granted: Super Admin level"; break; case 'editor': // Editor privileges echo "Access granted: Editor level"; break; case 'viewer': // Viewer privileges echo "Access granted: Viewer level"; break; default: // No access echo "Access denied: Invalid role"; break; }
ハッカーが役割を推測し、異なるレベルの認可にアクセスするために役割を変更する可能性があるため、このコードはすでにデータ改ざんに対して脆弱です。
ただし、彼らは私たちのスーパー管理者の役割名を決して推測できないため、少しは安心できるかもしれません。
しかし、まったく推測する必要がない場合はどうなるでしょうか?☠️
Switch Case では緩い比較が使用されていることをご存知ですか? はっ!あなたは今ショックを受けているかもしれません!
これは、ハッカーが $_POST['user_role'] = true を追加すると、値に関係なく switch ステートメントの最初のケースにアクセスすることを意味します。お尻が痛くないですか?ドキュメントをお読みください。
緩い比較のバグを軽減することは、PHP アプリケーションのセキュリティと信頼性を確保する上で重要です。 PHP バージョン 8.0 以降では、厳密な比較 === と一致式の使用が、このプロセスで重要な役割を果たします。 PHP の型のジャグリングにより予期せぬ潜在的に危険な結果が生じる可能性がある緩い比較演算子 == とは異なり、厳密な比較では変数の値と型の両方が確実にチェックされます。これにより、セキュリティチェックをバイパスするために悪用される可能性のある、意図しない型強制などの脆弱性が排除されます。
一致式を使用した安全でない認証バグの解決策は次のとおりです:
$user_role = $_POST['role']; $response = match ($user_role) { 'crazyDifficultAdminRoleNooneWouldEverGuess' => "Access granted: Super Admin level", 'editor' => "Access granted: Editor level", 'viewer' => "Access granted: Viewer level", default => "Access denied: Invalid role", }; echo $response; # This outputs: 'Access denied: Invalid role' when role is set to true
PHP における緩い比較と型のジャグリングの危険性についてご存知ですか?そうでなかったとしても、今はそうすることができます。この簡単な記事を、常にドキュメントに目を通し、プログラミング時に使用するすべてのものについてしっかりと理解を深めておくことを思い出させてください。何をするにしても最高になろうと努力するとき、好奇心は鍵となります!
=== の厳格な規律と一致の正確な精度を採用することで、PHP コードをしっかりと拘束し、期待どおりに動作するようにすることができます。ここで少し厳密にすることで、後で多くの頭痛の種を避けることができることを覚えておいてください。これは、コーディングの過程のどこにいても、常に何か新しいことを学ぶ必要があるという遊び心のある一助として考えてください。したがって、常に目を開いて好奇心を持ち続け、これらの大雑把な比較をネットから漏らさないようにしてください。 ?
私についての詳細は、sudorealm.com の私の個人ブログ スペースでご覧いただけます。
私の文章スタイルとコンテンツが気に入ったら、ためらわずにフォロー ボタンを押してください。そうすれば魔法のようなことが起こるでしょう! ??
以上がPHP セキュア コーディング: コードを緩めないでくださいの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。