Dengan pembangunan Internet yang berterusan, orang ramai memberi perhatian yang lebih kepada perlindungan data Operasi seperti log masuk dan pendaftaran tapak web perlu disahkan oleh kod pengesahan untuk mengelakkan serangan dan pendaftaran mesin berniat jahat. Hari ini saya akan berkongsi dengan anda kaedah penjanaan kod pengesahan PHP dan penyelesaian kepada masalah biasa.
1. Kaedah penjanaan kod pengesahan
Pustaka GD ialah perpustakaan pemprosesan grafik dalam PHP yang menyediakan Banyak fungsi operasi grafik. Dengan menggunakan perpustakaan GD, kami boleh menjana kod pengesahan imej dengan cepat.
Langkah-langkahnya adalah seperti berikut:
① Mulakan kanvas: Fungsi imagecreatetruecolor() boleh mencipta kanvas warna sebenar mengikut parameter yang ditentukan. Contohnya, imagecreatetruecolor(120, 40) mencipta kanvas truecolor 120x40 piksel.
② Lukis latar belakang gangguan: Gunakan fungsi imagerectangle() untuk melukis beberapa garisan gangguan dalam gelung untuk menjadikan kod pengesahan lebih sukar untuk dikenali oleh mesin.
③ Hasilkan rentetan rawak: Gunakan fungsi rawak (rand() dan mt_rand()) untuk menjana rentetan rentetan rawak sebagai aksara dalam imej kod pengesahan.
④ Lukis aksara kod pengesahan pada kanvas: Gunakan fungsi imagechar() untuk melukis rentetan rawak pada kanvas.
⑤ Output imej kod pengesahan ke penyemak imbas: gunakan fungsi header() untuk menetapkan Content-Type kepada image/png atau image/jpeg, dan gunakan fungsi imagepng() atau imagejpeg() untuk output kanvas ke pelayar untuk paparan.
Berikut ialah kod penjanaan kod pengesahan pustaka PHP GD yang ringkas:
<?php session_start(); // 创建画布 $img = imagecreatetruecolor(120, 40); //生成干扰线 for ($i = 0; $i < 5; $i++) { $color = imagecolorallocate($img, rand(0, 255), rand(0, 255), rand(0, 255)); imageline($img, rand(0, 120), rand(0, 40), rand(0, 120), rand(0, 40), $color); } //生成随机验证码 $code = ''; for ($i = 0; $i < 4; $i++) { $code .= rand(0, 9); } //绘制验证码 $font = 'arial.ttf'; $text_color = imagecolorallocate($img, rand(0, 255), rand(0, 255), rand(0, 255)); imagettftext($img, 18, rand(-10, 10), 10, 24, $text_color, $font, $code); //输出验证码图片到浏览器 header('Content-Type: image/png'); imagepng($img); imagedestroy($img); //将生成的验证码存储到Session中 $_SESSION['code'] = $code; ?>
2 Gunakan pustaka PHP GD untuk menjana kod pengesahan berangka
Kod pengesahan berangka dicampur dengan. berkenaan dengan CAPTCHA abjad angka adalah lebih ringkas dan lebih mudah difahami, jadi banyak tapak web menggunakan CAPTCHA berangka. Berikut ialah contoh kod yang menggunakan pustaka PHP GD untuk menjana kod pengesahan digital:
<?php session_start(); // 创建画布 $image = imagecreatetruecolor(120, 40); // 生成干扰背景 $gray = imagecolorallocate($image, 200, 200, 200); imagefill($image, 0, 0, $gray); for ($i = 0; $i < 50; $i++) { $black = imagecolorallocate($image, 0, 0, 0); imagesetpixel($image, rand(0, 120), rand(0, 40), $black); } // 生成随机数字 $code = ''; for ($i = 0; $i < 4; $i++) { $code .= rand(0, 9); } // 将验证码写入画布中 $font = 'arial.ttf'; $white = imagecolorallocate($image, 255, 255, 255); imagettftext($image, 20, 0, 15, 30, $white, $font, $code); // 将验证码输出到浏览器 header('Content-Type: image/png'); imagepng($image); imagedestroy($image); // 存储验证码到Session中 $_SESSION['code'] = $code; ?>
3 Gunakan pustaka pihak ketiga untuk menjana kod pengesahan
Walaupun pustaka PHP GD. baru disebut berkuasa, terdapat beberapa Kelemahan, seperti imej kod pengesahan yang dijana terlalu ringkas dan mudah dipecahkan oleh robot. Oleh itu, kami boleh menggunakan beberapa perpustakaan pihak ketiga untuk menjana kod pengesahan yang lebih kompleks.
Sebagai contoh, Gregwar/Captcha ialah perpustakaan kod pengesahan pihak ketiga yang popular yang boleh menjana pelbagai gaya imej kod pengesahan. Kaedah penggunaan juga sangat mudah Anda hanya perlu memuat turun perpustakaan dan mengimport fail captcha.php, dan memanggil fungsi create() untuk menjana kod pengesahan.
Berikut ialah contoh kod menggunakan perpustakaan Gregwar/Captcha untuk menjana kod pengesahan:
<?php session_start(); require_once 'Captcha/autoload.php'; $captcha = new GregwarCaptchaCaptchaBuilder; //配置验证码参数 $captcha->build( 120, 40, null, //font color true //background image ); header('Content-Type: image/jpeg'); $captcha->output(); $code = $captcha->getPhrase(); $_SESSION['code'] = $code; ?>
2. Penyelesaian kepada masalah biasa
Seperti yang dinyatakan di atas, jika corak kod pengesahan yang dijana terlalu mudah, ia boleh dipecahkan dengan mudah oleh robot. Untuk menyelesaikan masalah ini, kita boleh menambah pelbagai titik hingar, seperti garis gangguan, lengkok, corak latar belakang, dll. Kod pengesahan yang dijana dengan cara ini adalah lebih kompleks dan meningkatkan keselamatan.
Sesetengah robot akan cuba menjana berbilang kod pengesahan dalam satu saat untuk memecahkan kod pengesahan. Untuk mengelakkan serangan ini, kami boleh menambah beberapa TimeDelay, iaitu, apabila robot kerap menyerahkan kod pengesahan, kami boleh membiarkannya menunggu untuk tempoh masa sebelum menyerahkan semula. Ini berkesan menghalang serangan bot.
Dalam projek sebenar, kod pengesahan tidak seharusnya wujud terlalu lama, kerana dari semasa ke semasa, keselamatan kod pengesahan Sex akan dikurangkan. Kami perlu menetapkan masa tamat tempoh kod pengesahan (contohnya, 30 saat) selepas menjana kod pengesahan dan mengesahkannya apabila menyerahkan kod pengesahan Jika masa tamat tempoh melebihi, kod pengesahan mesti dijana semula.
Akhir sekali, kita perlu ambil perhatian bahawa dalam aplikasi sebenar, selain menyediakan perlindungan kod pengesahan, bentuk langkah perlindungan keselamatan lain juga diperlukan, seperti suntikan SQL, serangan XSS dan penyelesaian lain, untuk lebih baik melindungi keselamatan Laman web.
Atas ialah kandungan terperinci Kaedah penjanaan kod pengesahan PHP dan penyelesaian kepada masalah biasa. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!