Kod pengesahan rawak ialah cara biasa untuk tapak web moden untuk menghalang serangan berniat jahat dan penipuan Banyak tapak web menggunakan kod pengesahan rawak dalam log masuk, pendaftaran, mendapatkan kata laluan dan halaman lain. Antaranya, PHP, sebagai bahasa pengaturcaraan back-end yang biasa digunakan, sering digunakan untuk menjana kod pengesahan rawak. Walau bagaimanapun, kadangkala kami menghadapi masalah biasa: kod pengesahan rawak tidak boleh dijana. Jadi, apa sebenarnya yang menyebabkan ralat ini? Artikel ini akan menganalisis sebab mengapa kod pengesahan rawak tidak dapat dijana dan memberikan penyelesaian yang mungkin.
Dalam PHP, kita boleh menggunakan fungsi untuk menjana kod pengesahan rawak. Sebagai contoh, anda boleh menggunakan fungsi mt_rand() untuk menjana kod pengesahan rawak 5 digit.
$code = mt_rand(10000,99999);
Kod ini akan menjana integer rawak antara 10000 dan 99999. Walau bagaimanapun, sesetengah fungsi PHP mempunyai ralat panggilan atau ralat logik, menyebabkan kod pengesahan gagal dijana. Pada ketika ini, kita perlu menyemak sama ada terdapat masalah dengan fungsi dalam kod.
Pertama, kita boleh menggunakan fungsi gema atau var_dump() untuk mencetak hasil fungsi penjanaan kod pengesahan.
$code = mt_rand(10000,99999); echo $code;
Jika kami tidak melihat sebarang output, kemungkinan besar terdapat masalah dengan fungsi penjanaan kod pengesahan. Pada ketika ini, kami boleh cuba mengulas kod lain, hanya membiarkan fungsi penjanaan kod pengesahan untuk dilaksanakan, untuk menyelesaikan masalah sahaja.
Jika terdapat masalah dengan fungsi penjanaan kod pengesahan itu sendiri, kami boleh mempertimbangkan untuk menggunakan fungsi penjanaan kod pengesahan lain. Sebagai contoh, anda boleh menggunakan rand(), random_int() dan fungsi lain.
Selepas menjana kod pengesahan rawak, kami perlu mengeluarkan kod pengesahan ke halaman web untuk pengguna input. Antaranya, kita boleh menggunakan fungsi imagestring() dalam PHP untuk mengeluarkan kod pengesahan.
header("Content-type: image/jpeg"); $im = imagecreatetruecolor(60, 20); $white = imagecolorallocate($im, 255, 255, 255); $black = imagecolorallocate($im, 0, 0, 0); imagefill($im, 0, 0, $white); imagestring($im, 5, 10, 5, $code, $black); imagejpeg($im); imagedestroy($im);
Kod ini akan menjana imej kod pengesahan 60*20 piksel dan mengeluarkannya ke halaman web. Walau bagaimanapun, sesetengah fungsi PHP mempunyai ralat panggilan atau ralat logik, menyebabkan kod pengesahan gagal dikeluarkan. Pada ketika ini, kita perlu menyemak sama ada terdapat masalah dengan fungsi dalam kod.
Pertama, kita boleh menggunakan fungsi echo atau var_dump() untuk mencetak hasil fungsi output kod pengesahan.
header("Content-type: image/jpeg"); $im = imagecreatetruecolor(60, 20); $white = imagecolorallocate($im, 255, 255, 255); $black = imagecolorallocate($im, 0, 0, 0); imagefill($im, 0, 0, $white); imagestring($im, 5, 10, 5, $code, $black); imagejpeg($im); imagedestroy($im);
Jika kita tidak melihat sebarang output, kemungkinan besar terdapat masalah dengan fungsi output captcha. Pada ketika ini, kami boleh cuba mengulas kod lain, hanya meninggalkan fungsi output kod pengesahan untuk dilaksanakan, untuk menyelesaikan masalah sahaja.
Jika terdapat masalah dengan fungsi output kod pengesahan itu sendiri, kami boleh mempertimbangkan untuk menggunakan fungsi output kod pengesahan lain. Sebagai contoh, anda boleh menggunakan fungsi seperti imagepng() dan imagegif().
Dalam PHP, kami menggunakan perpustakaan GD untuk menjana dan mengeluarkan imej kod pengesahan. Jika pustaka GD tidak wujud atau tidak dipasang, maka kami tidak akan dapat menjana dan mengeluarkan kod pengesahan. Pada ketika ini, kita perlu menyemak sama ada perpustakaan GD dipasang pada pelayan.
Kami boleh melaksanakan fungsi phpinfo() dalam persekitaran PHP untuk menyemak sama ada perpustakaan GD wujud.
Dengan melaksanakan fungsi phpinfo(), kita boleh menyemak sama ada terdapat sambungan yang berkaitan seperti gd, gd-jpeg, gd-png, gd-gif dan sebagainya. Jika sambungan ini tidak tersedia, maka kami perlu memasang pustaka GD pada pelayan. Di Ubuntu, kita boleh menggunakan arahan berikut untuk memasang pustaka GD:
sudo apt-get install php7.0-gd
Dalam beberapa kes, kami mungkin Kod pengesahan rawak akan dijana dengan kerap dalam tempoh yang singkat. Contohnya, jika pengguna memuat semula kod pengesahan beberapa kali dalam masa seminit, maka kami perlu kerap menjana semula kod pengesahan, yang boleh menyebabkan kod pengesahan dijana terlalu perlahan atau malah gagal dijana. Pada ketika ini, kami boleh menggunakan penyelesaian mudah: cache kod pengesahan.
Sebagai contoh, kita boleh menyimpan kod pengesahan dan masa penjanaannya dalam $_SESSION. Jika selang antara masa penjanaan kod pengesahan dan masa semasa adalah kurang daripada 30 saat, maka kami boleh terus menggunakan kod pengesahan terakhir tanpa menjana semula kod tersebut.
if(!isset($_SESSION['code']) || (time() - $_SESSION['time']) > 30){ $code = mt_rand(10000,99999); $_SESSION['code'] = $code; $_SESSION['time'] = time(); }else{ $code = $_SESSION['code']; }
Selain sebab biasa di atas, terdapat sebab lain yang mungkin menyebabkan kod pengesahan rawak gagal dijana. Sebagai contoh, terdapat masalah dengan persekitaran operasi PHP itu sendiri, atau beban pada pelayan terlalu tinggi, dsb. Pada ketika ini, kami perlu menyemak lebih lanjut fail konfigurasi PHP atau mengoptimumkan prestasi pelayan untuk menyelesaikan masalah.
Ringkasan
Menjana kod pengesahan rawak ialah langkah perlindungan keselamatan yang biasa untuk tapak web, sebagai bahasa pengaturcaraan bahagian belakang, juga biasa digunakan untuk menjana kod pengesahan rawak. Walau bagaimanapun, kadangkala kami menghadapi masalah bahawa kod pengesahan rawak tidak boleh dijana. Artikel ini menganalisis kemungkinan sebab kod pengesahan rawak tidak boleh dijana dan menyediakan penyelesaian yang sepadan. Untuk memastikan keselamatan tapak web, kita harus sangat berhati-hati apabila menjana kod pengesahan rawak dan sentiasa menyemak kod yang berkaitan dan persekitaran PHP.
Atas ialah kandungan terperinci Apakah yang perlu saya lakukan jika kod pengesahan rawak pada halaman php tidak dapat dijana?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!