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中默认的编码内存分配计算得有隐患.

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

機器學習演算法只接受數值輸入,所以如果我們遇到分類特徵的時候都會對分類特徵進行編碼,本文總結了常見的11個分類變數編碼方法。 1.ONE HOT ENCODING最受歡迎且常用的編碼方法是One Hot Enoding。一個具有n個觀測值和d個不同值的單一變量被轉換成具有n個觀測值的d個二元變量,每個二元變量使用一位(0,1)進行標識。例如:編碼後最簡單的實作是使用pandas的' get_dummiesnew_df=pd.get_dummies(columns=[‘Sex’], data=df)2、

無論您使用的是舊電腦還是需要您的 PC 同時執行許多任務,您可能會想要停用 Windows 模組安裝程式工作程式。原因是 Windows 模組安裝程式工作人員對您的磁碟、CPU 和記憶體施加了很高的負載。您可能會使用最好的軟體來修復高 CPU 使用率,但一些報告顯示它甚至可能佔用 100% 的 CPU 使用率。雖然它可以幫助您維護一個更安全和可靠的系統,但它會付出代價。因此,您可以決定保留或停用它以避免效能問題。在本文中,我們將詳細探討什麼是 Windows 模組安裝程式工作人員以及如何啟用或

utf8編碼漢字佔3個位元組。在UTF-8編碼中,一個中文等於三個位元組,一個中文標點佔三個位元組;而在Unicode編碼中,一個中文(含繁體)等於兩個位元組。 UTF-8使用1~4位元組為每個字元編碼,一個US-ASCIl字元只需1位元組編碼,帶有變音符號的拉丁文、希臘文、西里爾字母、亞美尼亞語、希伯來文、阿拉伯文、敘利亞文等字母則需要2位元組編碼。

大型語言模式(LLM)具有產生流暢和連貫文字的能力,為人工智慧的對話、創意寫作等領域帶來了新的前景。然而,LLM也存在一些關鍵限制。首先,它們的知識僅限於從訓練資料中辨識出的模式,缺乏對世界的真正理解。其次,推理能力有限,不能進行邏輯推理或從多個資料來源融合事實。面對更複雜、更開放的問題時,LLM的回答可能變得荒謬或矛盾,被稱為「幻覺」。因此,儘管LLM在某些方面非常有用,但在處理複雜問題和真實世界情境時,仍存在一定的限制。為了彌補這些差距,近年來出現了檢索增強生成(RAG)系統,其核心思想是

常見的編碼方式有ASCII編碼、Unicode編碼、UTF-8編碼、UTF-16編碼、GBK編碼等。詳細介紹:1、ASCII編碼是最早的字符編碼標準,使用7位二進制數表示128個字符,包括英文字母、數字、標點符號以及控製字符等;2、Unicode編碼是一種用於表示世界上所有字元的標準編碼方式,它為每個字元分配了一個唯一的數字碼點;3、UTF-8編碼等等。

PHP編碼小技巧:如何產生具有防偽驗證功能的二維碼?隨著電子商務和互聯網的發展,二維碼越來越被廣泛應用於各行各業。而在使用二維碼的過程中,為了確保產品的安全性和防止偽造,為二維碼添加防偽驗證功能是十分重要的一環。本文將介紹如何使用PHP產生具有防偽驗證功能的二維碼,並附上對應程式碼範例。在開始之前,我們需要準備以下幾個必要的工具和函式庫:PHPQRCode:PHP

PHP是一種流行的Web程式語言,可以用來編寫動態網頁和應用程式。在實際應用中,PHP經常需要與資料庫進行交互,進行資料的查詢和處理。然而,在使用PHP從資料庫中取得結果時,可能會遇到編碼的問題,這通常會導致出現亂碼。那麼,如何解決php資料庫查詢結果編碼的問題呢?

編碼規則是:1、如果前一個編碼是0,當前資料位元為0,則編碼為0;2、如果前一個編碼是0,當前資料位元為1,則編碼為雙極脈衝(+A或- A),並將計數器加1;3、如果前一個編碼是1,當前資料位元為1,則編碼為0,並將計數器加1;4、如果前一個編碼是1,目前資料位元為0,則根據計數器的奇偶性來決定編碼方式,如果是偶數,則編碼為(+B或-B),如果是奇數,則編碼為零電平,並將計數器清零等等。
