PHP4.4.2中关于BASE64编码中的一点BUG
今天偶然调试时,发现了base64编码时内存分配的BUG,为编码分配的缓冲区计算方式有隐患,偶尔出现缓冲区过小,导致后续堆内存被覆盖,访问越界. php-4.4.2/ext/standard/base64.c /* {{{ php_base64_encode */ PHPAPI unsigned char *php_base64_encode(const uns
今天偶然调试时,发现了base64编码时内存分配的BUG,为编码分配的缓冲区计算方式有隐患,偶尔出现缓冲区过小,导致后续堆内存被覆盖,访问越界.
php-4.4.2/ext/standard/base64.c
/* {{{ php_base64_encode */
PHPAPI unsigned char *php_base64_encode(const unsigned char *str, int length, int *ret_length)
{
const unsigned char *current = str;
unsigned char *p;
unsigned char *result;
if ((length + 2) = (1 if (ret_length != NULL) {
*ret_length = 0;
}
return NULL;
}
result = (unsigned char *)safe_emalloc(((length + 2) / 3) * 4, sizeof(char), 1);
p = result;
while (length > 2) { /* keep going until we have less than 24 bits */
*p++ = base64_table[current[0] >> 2];
*p++ = base64_table[((current[0] & 0x03) > 4)];
*p++ = base64_table[((current[1] & 0x0f) > 6)];
*p++ = base64_table[current[2] & 0x3f];
current += 3;
length -= 3; /* we just handle 3 octets of data */
}
/* now deal with the tail end of things */
if (length != 0) {
*p++ = base64_table[current[0] >> 2];
if (length > 1) {
*p++ = base64_table[((current[0] & 0x03) > 4)];
*p++ = base64_table[(current[1] & 0x0f) *p++ = base64_pad;
} else {
*p++ = base64_table[(current[0] & 0x03) *p++ = base64_pad;
*p++ = base64_pad;
}
}
if (ret_length != NULL) {
*ret_length = (int)(p - result);
}
*p = '/0';
return result;
}
我觉得计算方式应改为如下:
/* Account the result buffer size and alloc the memory for it. */
if ((length % 3) != 0)
{
padnum = 3 - length % 3;
}
retsize = (length + padnum) + ((length + padnum) / 3) + 1; // 正确的大小
稍微解释一下,因为BASE64需要将3个8位字节转换成4个6位的元组,4个6位元组每一组都可以用编码表中的一个ASCII码表示,这样的话,即就是每3个字节会多出一个字节,所以最终编码应该多出((length + padnum) / 3)个. 原理就是如此,而standard中默认的编码内存分配计算得有隐患.

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Algoritma pembelajaran mesin hanya menerima input berangka, jadi jika kami menemui ciri kategori, kami akan mengekodkan ciri kategori Artikel ini meringkaskan 11 kaedah pengekodan pembolehubah kategori biasa. 1. ONE HOT ENCOD Kaedah pengekodan yang paling popular dan biasa digunakan ialah One Hot Enoding. Pembolehubah tunggal dengan n pemerhatian dan d nilai berbeza ditukar kepada d pembolehubah binari dengan n pemerhatian, setiap pembolehubah binari dikenal pasti dengan sedikit (0, 1). Contohnya: pelaksanaan paling mudah selepas pengekodan ialah menggunakan get_dummiesnew_df=pd.get_dummies(columns=[‘Sex’], data=df)2, panda,

Sama ada anda mempunyai komputer lama atau memerlukan PC anda menjalankan banyak tugas secara serentak, anda mungkin mahu melumpuhkan pekerja Pemasang Modul Windows. Sebabnya ialah pekerja Windows Modules Installer meletakkan beban yang tinggi pada cakera, CPU dan memori anda. Anda boleh menggunakan perisian terbaik untuk membetulkan penggunaan CPU yang tinggi, tetapi beberapa laporan menunjukkan bahawa ia juga boleh mengambil 100% penggunaan CPU. Walaupun ia boleh membantu anda mengekalkan sistem yang lebih selamat dan boleh dipercayai, ia memerlukan kos. Oleh itu, anda boleh memutuskan untuk menyimpannya atau melumpuhkannya untuk mengelakkan masalah prestasi. Dalam artikel ini, kami akan meneroka secara terperinci apakah Windows Modules Installer Worker dan cara mendayakan atau

Aksara Cina yang dikodkan UTF8 menduduki 3 bait. Dalam pengekodan UTF-8, satu aksara Cina bersamaan dengan tiga bait, dan satu tanda baca bahasa Cina menduduki tiga bait manakala dalam pengekodan Unicode, satu aksara Cina (termasuk bahasa Cina tradisional) adalah sama dengan dua bait; UTF-8 menggunakan 1~4 bait untuk mengekod setiap aksara Satu aksara AS-ASCIl hanya memerlukan 1 bait untuk mengekod Latin, Yunani, Cyrillic, Armenia dan Ibrani dengan tanda diakritik , Arab, Syria dan huruf lain pengekodan.

Model bahasa besar (LLM) mempunyai keupayaan untuk menghasilkan teks yang lancar dan koheren, membawa prospek baharu ke bidang seperti perbualan kecerdasan buatan dan penulisan kreatif. Walau bagaimanapun, LLM juga mempunyai beberapa had utama. Pertama, pengetahuan mereka terhad kepada corak yang diiktiraf daripada data latihan, kurang pemahaman sebenar tentang dunia. Kedua, kemahiran menaakul adalah terhad dan tidak boleh membuat inferens logik atau menggabungkan fakta daripada pelbagai sumber data. Apabila berhadapan dengan soalan yang lebih kompleks dan terbuka, jawapan LLM mungkin menjadi tidak masuk akal atau bercanggah, dikenali sebagai "ilusi." Oleh itu, walaupun LLM sangat berguna dalam beberapa aspek, ia masih mempunyai had tertentu apabila berhadapan dengan masalah kompleks dan situasi dunia sebenar. Untuk merapatkan jurang ini, sistem penjanaan dipertingkatkan semula (RAG) telah muncul dalam beberapa tahun kebelakangan ini

Kaedah pengekodan biasa termasuk pengekodan ASCII, pengekodan Unikod, pengekodan UTF-8, pengekodan UTF-16, pengekodan GBK, dsb. Pengenalan terperinci: 1. Pengekodan ASCII ialah standard pengekodan aksara yang paling awal, menggunakan nombor perduaan 7-bit untuk mewakili 128 aksara, termasuk huruf Inggeris, nombor, tanda baca, aksara kawalan, dsb. 2. Pengekodan Unikod ialah kaedah yang digunakan untuk mewakili semua aksara di dunia Kaedah pengekodan standard aksara, yang memberikan titik kod digital yang unik kepada setiap aksara 3. Pengekodan UTF-8, dsb.

PHP ialah bahasa pengaturcaraan web yang popular yang boleh digunakan untuk menulis halaman web dan aplikasi dinamik. Dalam aplikasi praktikal, PHP selalunya perlu berinteraksi dengan pangkalan data untuk membuat pertanyaan dan memproses data. Walau bagaimanapun, apabila menggunakan PHP untuk mendapatkan hasil daripada pangkalan data, anda mungkin menghadapi masalah pengekodan, yang sering mengakibatkan aksara bercelaru. Jadi, bagaimana untuk menyelesaikan masalah pengekodan hasil pertanyaan pangkalan data PHP?

Petua pengekodan PHP: Bagaimana untuk menjana kod QR dengan fungsi pengesahan anti-pemalsuan? Dengan perkembangan e-dagang dan Internet, kod QR semakin digunakan dalam pelbagai industri. Dalam proses menggunakan kod QR, untuk memastikan keselamatan produk dan mencegah pemalsuan, adalah sangat penting untuk menambah fungsi pengesahan anti-pemalsuan pada kod QR. Artikel ini akan memperkenalkan cara menggunakan PHP untuk menjana kod QR dengan fungsi pengesahan anti-pemalsuan dan melampirkan contoh kod yang sepadan. Sebelum memulakan, kita perlu menyediakan alatan dan perpustakaan yang diperlukan berikut: PHPQRCode: PHP

Peraturan pengekodan ialah: 1. Jika kod sebelumnya ialah 0 dan bit data semasa ialah 0, kodnya ialah 0. Jika kod sebelumnya ialah 0 dan bit data semasa ialah 1, kod itu ialah nadi bipolar (+A; atau - A), dan pembilang dinaikkan sebanyak 1. Jika kod sebelumnya ialah 1, dan bit data semasa ialah 1, kodnya ialah 0, dan pembilang dinaikkan sebanyak 1. Jika kod sebelumnya ialah 1, bit data semasa ialah 0, Kaedah pengekodan ditentukan berdasarkan pariti pembilang Jika ia adalah nombor genap, pengekodan adalah (+B atau -B Jika ia adalah nombor ganjil, pengekodan adalah). tahap sifar dan kaunter dibersihkan dan sebagainya.
