Rumah > Artikel > pembangunan bahagian belakang > Pengekodan Selamat PHP: Jangan Biarkan Kod Terlepas
Saya sedang berbual santai dengan seorang rakan pada hari lain yang merupakan peneraju teknologi pada permulaan yang berjaya, dan semasa kami menonton perlawanan akhir Olimpik bagi polo air wanita, kami mula bercakap tentang kegagalan PHP yang saya temui di alam liar ?. Dia sebagai peneraju teknologi dan saya seorang pertengahan, saya menjangkakan dia sudah pun mengatasi kegagalan ini dalam kesibukan sehariannya, tetapi... sungguh mengejutkan walaupun kedengarannya dia tidak melakukannya.
"Gagal" yang saya maksudkan, dan anda mungkin sudah menekanya, tidak lain adalah perbandingan longgar PHP. Sekarang, untuk bersikap adil, saya tidak akan benar-benar menyebutnya sebagai kegagalan, tetapi ciri, tetapi penggunaannya boleh menjadi sangat berbahaya sehingga, dalam erti kata itu, ia adalah gagal! Jom dapatkan nerd kami!
Perbandingan longgar dalam PHP ialah apabila anda membandingkan dua nilai menggunakan operator ==, yang tidak menyemak jenis data pembolehubah yang dibandingkan. PHP akan cuba menukar nilai kepada jenis biasa sebelum membandingkannya.
if ('string' == true){ echo 'Weedle I choose you'; } else{ echo 'Charizard I choose you'; }
Percaya atau tidak, kami akan menghantar Weedle 3 peringkat ke dalam pertempuran di sini, sementara Charizard kami masih tidak digunakan. KENAPA? Nah, dalam contoh di atas, PHP menukar rentetan 'rentetan' kepada true sebelum membandingkannya dengan true, membawa kepada perbandingan sebenar ?. Tingkah laku ini, walaupun kadangkala berguna, boleh berbahaya jika tidak difahami dan dikawal dengan betul.
Semak Jadual Perbandingan Longgar ini daripada Dokumen PHP untuk mendapatkan maklumat lanjut
Mungkin nampaknya tidak seberapa pada mulanya, tetapi percayalah kepada saya kepada pembangun terlatih, helah ini entah dari mana mungkin akan menggigil ke tulang mereka dan menghantar mereka ke pemfaktoran semula kod pengeluaran.
Dalam bahagian artikel ini, saya akan cuba memberikan beberapa blok kod yang apabila ditemui di alam liar boleh memberi anda ganjaran hadiah pepijat yang hebat, juga jika anda menjumpai sesuatu yang serupa dengan pangkalan kod anda... ubahnya ?
Dalam coretan di bawah anda melihat logik sistem log masuk yang sangat asas.
$username = $_POST['username']; $password = $_POST['password']; if ($username == 'admin' && $password == '12345') { // Grant access }
Katakanlah penggodam yang licik mengganggu data yang dihantar dan menjadikannya: $_POST['nama pengguna'] = benar dan $_POST['kata laluan'] = benar yang akan mengakibatkan:
$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
Jika anda tertanya-tanya bagaimana penggodam boleh mengganggu data kami, saya ada dua jawapan untuk anda dari kepala saya:
Seterusnya.
Di sinilah saya mempamerkan masalah dengan PHP yang mungkin mengejutkan anda.
$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; }
Kod ini sudah pun terdedah kepada gangguan data kerana penggodam boleh meneka peranan dan menukarnya untuk mengakses tahap kebenaran yang berbeza.
Kami mungkin berasa agak selamat, kerana mereka tidak akan dapat meneka nama peranan Super Admin kami.
Tetapi bagaimana jika mereka tidak perlu meneka sama sekali?☠️
Tahukah anda bahawa Switch Case menggunakan perbandingan yang longgar? Ha! anda mungkin terkejut sekarang!
Ini bermakna jika Penggodam menambah $_POST['user_role'] = benar maka mereka akan mengakses kes pertama kami dalam pernyataan suis kami tidak kira nilainya. Bukankah itu sakit di bahagian bawah? Baca dokumen.
Mengurangkan pepijat perbandingan yang longgar adalah penting dalam memastikan keselamatan dan kebolehpercayaan aplikasi PHP anda. Penggunaan perbandingan ketat === dan ungkapan padanan, dalam PHP versi 8.0+, memainkan peranan penting dalam proses ini. Tidak seperti operator perbandingan longgar ==, yang boleh membawa kepada keputusan yang tidak dijangka dan berpotensi berbahaya disebabkan oleh juggling jenis PHP, perbandingan yang ketat memastikan kedua-dua nilai dan jenis pembolehubah disemak. Ini menghapuskan kelemahan seperti paksaan jenis yang tidak disengajakan, yang boleh dieksploitasi untuk memintas pemeriksaan keselamatan.
Berikut ialah penyelesaian kepada pepijat kebenaran Tidak selamat menggunakan ungkapan padanan:
$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
Tahukah anda tentang bahaya perbandingan longgar dan juggling jenis dalam PHP? Jika anda tidak melakukannya, kini anda lakukan. Biarkan artikel ringkas ini menjadi peringatan untuk sentiasa membaca dokumentasi dan membangunkan pemahaman yang kukuh tentang semua yang anda gunakan semasa pengaturcaraan. Rasa ingin tahu adalah penting apabila anda berusaha untuk menjadi yang terbaik dalam apa jua perkara yang anda lakukan!
Dengan mengamalkan disiplin === yang ketat dan ketepatan padanan yang tajam, anda boleh mengekalkan kod PHP anda pada tali yang ketat, memastikan ia berkelakuan tepat seperti yang anda jangkakan. Ingat, sedikit ketat sekarang boleh menjimatkan banyak sakit kepala nanti. Biarkan ini menjadi dorongan suka bermain bahawa tidak kira di mana anda berada dalam perjalanan pengekodan anda, sentiasa ada sesuatu yang baharu untuk dipelajari. Jadi, pastikan mata itu terbuka, kekal ingin tahu, dan jangan biarkan perbandingan yang longgar itu terlepas dari internet! ?
Anda boleh mengetahui lebih lanjut tentang saya dalam ruang blog peribadi saya di sudorealm.com.
Jika anda suka gaya penulisan saya dan kandungan saya, jangan teragak-agak untuk menekan butang ikut itu, dan perkara ajaib akan berlaku! ??
Atas ialah kandungan terperinci Pengekodan Selamat PHP: Jangan Biarkan Kod Terlepas. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!