先日、成功したスタートアップ企業の技術責任者である友人と何気ない会話をしていました。オリンピックの女子水球決勝を見ながら、私が実際に見つけた PHP の失敗について話し始めました。 ?。彼は技術リーダーであり、私は開発中間者なので、彼は日常の忙しい中でこの失敗にすでに取り組んでいると予想していましたが、まあ... 思われるかもしれませんが、彼がまだ取り組んでいなかったのは驚くべきことでした。
私が話している「失敗」とは、もうお気づきかと思いますが、PHP の 緩やかな比較 に他なりません。さて、公平を期すために、私はこれを失敗というほどではなく、機能と呼びたいのですが、その使用方法は非常に危険である可能性があるため、その意味では、これは失敗です。オタクを始めましょう!
PHP における緩い比較とは、== 演算子を使用して 2 つの値を比較することであり、比較される変数のデータ型はチェックされません。 PHP は値を比較する前に、値を共通の型に変換しようとします。
if ('string' == true){ echo 'Weedle I choose you'; } else{ echo 'Charizard I choose you'; }
信じられないかもしれませんが、リザードンは未使用のままで、ここで 3 レベルのビードルを戦闘に送り込もうとしています。 WHY? さて、上の例では、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 の個人ブログ スペースでご覧いただけます。
私の文章スタイルとコンテンツが気に入ったら、ためらわずにフォロー ボタンを押してください。そうすれば魔法のようなことが起こるでしょう! ??
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3