Kaedah pelaksanaan fungsi penjanaan kod pengesahan imej PHP

WBOY
Lepaskan: 2023-06-15 21:26:01
asal
1332 orang telah melayarinya

Kaedah pelaksanaan fungsi penjanaan kod pengesahan imej PHP

Kod pengesahan imej ialah kod pengesahan keselamatan yang dipaparkan dalam bentuk imej, yang boleh menghalang pelbagai serangan rangkaian dengan berkesan, seperti perengkahan brute force dan skrip automatik serangan menunggu. Sebagai bahasa pengaturcaraan Web yang popular, PHP mempunyai fungsi pemprosesan imej terbina dalam dan perpustakaan yang boleh melaksanakan fungsi kod pengesahan imej dengan mudah. Artikel ini akan memperkenalkan kaedah pelaksanaan fungsi penjanaan kod pengesahan imej berasaskan PHP.

Pertama sekali, kita perlu menjelaskan elemen kod pengesahan imej: kanvas, aksara kod pengesahan, garisan gangguan, titik gangguan, dsb. Seterusnya, kami akan melaksanakan elemen ini satu demi satu untuk melaksanakan fungsi penjanaan kod pengesahan imej PHP yang lengkap.

  1. Buat kanvas

Untuk mencipta kanvas, kita boleh menggunakan fungsi imagecreatetruecolor() PHP. Fungsi ini mencipta imej truecolor saiz yang ditentukan. Berikut ialah format panggilan bagi fungsi ini:

resource imagecreatetruecolor (int $width, int $height)

di mana parameter lebar dan ketinggian ialah lebar dan tinggi imej masing-masing. Berikut ialah contoh kod untuk mencipta kanvas:

// 创建画布
$image_width = 140; // 画布宽度
$image_height = 50; // 画布高度
$image = imagecreatetruecolor($image_width, $image_height);
Salin selepas log masuk
  1. Tetapkan warna latar belakang

Untuk menetapkan warna latar belakang, kita boleh menggunakan fungsi imagefill() PHP. Fungsi ini mewarnakan imej, mengisi keseluruhan imej dengan warna yang ditentukan. Berikut ialah format panggilan bagi fungsi ini:

imej bool ( resource $image , int $x , int $y , int $color )

di mana parameter imej ialah sumber imej, x dan y Parameter ialah koordinat titik permulaan pencelupan, dan parameter warna ialah warna, yang dicipta menggunakan fungsi imagecolorallocate().

Berikut ialah contoh kod untuk menetapkan warna latar belakang:

// 设置背景颜色
$bg_color = imagecolorallocate($image, 255, 255, 255); // 白色 
imagefill($image, 0, 0, $bg_color); // 填充背景为白色
Salin selepas log masuk
  1. Tambah garisan gangguan dan titik gangguan

Untuk meningkatkan keselamatan kod pengesahan, kami memerlukan Tambah garisan gangguan dan titik gangguan. Fungsi pemprosesan imej asas PHP boleh melaksanakan fungsi ini.

Untuk menambah garisan gangguan, anda boleh menggunakan fungsi imageline() PHP. Fungsi ini melukis garis lurus. Berikut ialah format panggilan bagi fungsi ini:

bool imageline ( resource $image , int $x1 , int $y1 , int $x2 , int $y2 , int $color )

di mana , imej Parameter ialah sumber imej, (x1, y1) dan (x2, y2) ialah koordinat permulaan dan penamat bagi segmen garisan, dan parameter warna ialah warna.

Untuk menambah titik gangguan, anda boleh menggunakan fungsi imagesetpixel() PHP. Fungsi ini melukis piksel dalam imej. Berikut ialah format panggilan bagi fungsi ini:

bool imagesetpixel ( resource $image , int $x , int $y , int $color )

di mana parameter imej ialah sumber imej, (x, y) ialah koordinat titik piksel, dan parameter warna ialah warna.

Berikut ialah contoh kod untuk menambah garisan gangguan dan titik gangguan:

// 添加干扰线
for ($i = 0; $i < 5; $i++) {
    $line_color = imagecolorallocate($image, rand(0, 255), rand(0, 255), rand(0, 255)); // 随机颜色
    imageline($image, rand(0, $image_width), rand(0, $image_height),
        rand(0, $image_width), rand(0, $image_height), $line_color);
}
// 添加干扰点
for ($i = 0; $i < 50; $i++) {
    $pixel_color = imagecolorallocate($image, rand(0, 255), rand(0, 255), rand(0, 255)); // 随机颜色
    imagesetpixel($image, rand(0, $image_width), rand(0, $image_height), $pixel_color);
}
Salin selepas log masuk
  1. Tambah aksara kod pengesahan

Langkah terakhir, kita perlu tambah aksara kod pengesahan . Aksara kod pengesahan boleh berupa nombor, huruf, simbol, dsb. Untuk kemudahan, kami hanya mempertimbangkan kod pengesahan berangka di sini.

Untuk menambah aksara kod pengesahan, anda boleh menggunakan fungsi imagestring() PHP atau fungsi imagettftext().

Apabila menggunakan fungsi imagestring(), fungsi tersebut mengeluarkan rentetan terus pada imej. Berikut ialah format panggilan bagi fungsi ini:

bool imagestring ( resource $image , int $font , int $x , int $y , string $string , int $color )

di mana , imej Parameter ialah sumber imej, fon ialah saiz fon, x dan y ialah koordinat titik permulaan rentetan, rentetan ialah rentetan output, dan warna ialah warna.

Apabila menggunakan fungsi imagettftext(), fungsi akan mengeluarkan rentetan yang ditentukan ke kanvas yang ditentukan mengikut fon, saiz dan sudut putaran sewenang-wenangnya. Berikut ialah format panggilan bagi fungsi ini:

array imagettftext ( resource $image , float $size , float $angle , int $x , int $y , int $color ,
string $fontfile , string $ text )

Antaranya, parameter imej ialah sumber imej, saiz ialah saiz fon, sudut ialah sudut putaran, (x, y) ialah koordinat titik permulaan rentetan, warna ialah warna, fail fon ialah fail fon, dan teks ialah rentetan output.

Berikut ialah contoh kod untuk menjana aksara kod pengesahan:

// 添加验证码字符
$code = '';
for ($i = 0; $i < 4; $i++) {
    $digital_color = imagecolorallocate($image, rand(0, 200), rand(0, 200), rand(0, 200)); // 随机颜色
    $digital = rand(0, 9); // 随机数字
    $code .= $digital;
    // 按一定的规则将字符画布输出
    imagettftext($image, 20, rand(-30, 30), $i * 30 + 10, rand($image_height/2, $image_height-20),
        $digital_color, './arial.ttf', $digital);
}
Salin selepas log masuk

Akhir sekali, simpan aksara kod pengesahan dalam sesi untuk perbandingan dan pengesahan seterusnya.

$_SESSION['code'] = $code;
Salin selepas log masuk

Contoh kod penuh:

session_start();

header("Content-type: image/png");

$image_width = 140; // 画布宽度
$image_height = 50; // 画布高度

$image = imagecreatetruecolor($image_width, $image_height); // 创建画布

$bg_color = imagecolorallocate($image, 255, 255, 255); // 白色 
imagefill($image, 0, 0, $bg_color); // 填充背景为白色

// 添加干扰线
for ($i = 0; $i < 5; $i++) {
    $line_color = imagecolorallocate($image, rand(0, 255), rand(0, 255), rand(0, 255)); // 随机颜色
    imageline($image, rand(0, $image_width), rand(0, $image_height),
        rand(0, $image_width), rand(0, $image_height), $line_color);
}

// 添加干扰点
for ($i = 0; $i < 50; $i++) {
    $pixel_color = imagecolorallocate($image, rand(0, 255), rand(0, 255), rand(0, 255)); // 随机颜色
    imagesetpixel($image, rand(0, $image_width), rand(0, $image_height), $pixel_color);
}

// 添加验证码字符
$code = '';
for ($i = 0; $i < 4; $i++) {
    $digital_color = imagecolorallocate($image, rand(0, 200), rand(0, 200), rand(0, 200)); // 随机颜色
    $digital = rand(0, 9); // 随机数字
    $code .= $digital;
    // 按一定的规则将字符画布输出
    imagettftext($image, 20, rand(-30, 30), $i * 30 + 10, rand($image_height/2, $image_height-20),
        $digital_color, './arial.ttf', $digital);
}

$_SESSION['code'] = $code; // 将验证码存入session

imagepng($image); // 输出验证码图片

imagedestroy($image); // 销毁图像资源
Salin selepas log masuk

Ringkasan

Fungsi penjanaan kod pengesahan imej PHP ialah teknologi yang sangat praktikal untuk menghalang serangan rangkaian. Artikel ini memperkenalkan kaedah pelaksanaan fungsi penjanaan kod pengesahan imej PHP, termasuk mencipta kanvas, menetapkan warna latar belakang, menambah garisan gangguan dan titik gangguan, menambah aksara kod pengesahan, dsb. Melalui gabungan penggunaan elemen ini, kod pengesahan imej yang berkualiti tinggi dan selamat boleh dihasilkan.

Atas ialah kandungan terperinci Kaedah pelaksanaan fungsi penjanaan kod pengesahan imej PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan