ホームページ php教程 php手册 PHP4.4.2中关于BASE64编码中的一点BUG

PHP4.4.2中关于BASE64编码中的一点BUG

Jun 06, 2016 pm 07:46 PM
base64 について コーディング

今天偶然调试时,发现了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中默认的编码内存分配计算得有隐患.

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

11 の一般的な分類特徴エンコード技術 11 の一般的な分類特徴エンコード技術 Apr 12, 2023 pm 12:16 PM

機械学習アルゴリズムは数値入力のみを受け入れるため、カテゴリカルな特徴が見つかった場合は、そのカテゴリカルな特徴をエンコードします。この記事では、11 の一般的なカテゴリカル変数のエンコード方法を要約します。 1. ONE HOT エンコーディング 最も一般的で一般的に使用されているエンコーディング方式は One Hot Enoding です。 n 個の観測値と d 個の個別の値を持つ単一の変数は、n 個の観測値を持つ d 個のバイナリ変数に変換され、各バイナリ変数はビット (0, 1) で識別されます。例: コーディング後の最も簡単な実装は、パンダの get_dummiesnew_df=pd.get_dummies(columns=[‘Sex’], data=df)2 を使用することです。

Windows 11 で Windows モジュール インストーラー ワーカーを安全に無効にする方法 Windows 11 で Windows モジュール インストーラー ワーカーを安全に無効にする方法 Apr 13, 2023 pm 03:43 PM

古いコンピューターを使用している場合でも、PC で多くのタスクを同時に実行する必要がある場合でも、Windows モジュール インストーラー ワーカーを無効にすることができます。その理由は、Windows モジュール インストーラー ワーカーがディスク、CPU、メモリに高い負荷をかけるためです。最高のソフトウェアを使用して高い CPU 使用率を修正することもできますが、一部のレポートでは、CPU 使用率が 100% になることさえあります。これは、より安全で信頼性の高いシステムを維持するのに役立ちますが、コストがかかります。したがって、パフォーマンスの問題を回避するために、これを保持するか無効にするかを決定できます。この記事では、Windows モジュール インストーラー ワーカーとは何か、および有効化または有効化する方法について詳しく説明します。

utf8 でエンコードされた中国語の文字は何バイトを占めますか? utf8 でエンコードされた中国語の文字は何バイトを占めますか? Feb 21, 2023 am 11:40 AM

UTF8 でエンコードされた中国語文字は 3 バイトを占めます。 UTF-8 エンコードでは、1 つの中国語文字は 3 バイトに相当し、1 つの中国語の句読点は 3 バイトを占めますが、Unicode エンコードでは、1 つの中国語文字 (繁体字中国語を含む) は 2 バイトに相当します。 UTF-8 は各文字のエンコードに 1 ~ 4 バイトを使用します。1 つの US-ASCIl 文字のエンコードには 1 バイトのみが必要です。ラテン語、ギリシャ語、キリル文字、アルメニア語、および発音区別符号付きのヘブライ語。アラビア語、シリア語およびその他の文字は 2 バイトが必要です。エンコーディング。

ナレッジ グラフ: 大規模モデルの理想的なパートナー ナレッジ グラフ: 大規模モデルの理想的なパートナー Jan 29, 2024 am 09:21 AM

大規模言語モデル (LLM) は、滑らかで一貫したテキストを生成する機能を備えており、人工知能の会話や創造的な文章などの分野に新たな可能性をもたらします。ただし、LLM にはいくつかの重要な制限もあります。まず、彼らの知識はトレーニング データから認識されたパターンに限定されており、世界に対する真の理解が欠けています。第 2 に、推論スキルには限界があり、論理的な推論を行ったり、複数のデータ ソースからの事実を融合したりすることができません。より複雑で自由回答の質問に直面すると、LLM の答えは「幻想」として知られる不条理または矛盾したものになる場合があります。したがって、LLM はいくつかの面では非常に便利ですが、複雑な問題や現実世界の状況を扱う場合には、依然として一定の制限があります。これらのギャップを埋めるために、検索拡張生成 (RAG) システムが近年登場しました。

いくつかの一般的なエンコード方法 いくつかの一般的なエンコード方法 Oct 24, 2023 am 10:09 AM

一般的なエンコード方法には、ASCII エンコード、Unicode エンコード、UTF-8 エンコード、UTF-16 エンコード、GBK エンコードなどがあります。詳細な紹介: 1. ASCII エンコードは、英語の文字、数字、句読点、制御文字などを含む 128 文字を表すために 7 ビット 2 進数を使用する、最も初期の文字エンコード標準です; 2. Unicode エンコードは、文字を表すために使用される方法です。世界中のすべての文字 各文字に固有のデジタル コード ポイントを割り当てる文字の標準的なエンコード方式、3. UTF-8 エンコードなど。

PHPデータベースクエリ結果のエンコードの問題を解決する方法 PHPデータベースクエリ結果のエンコードの問題を解決する方法 Mar 21, 2023 am 11:49 AM

PHP は、動的な Web ページやアプリケーションの作成に使用できる人気のある Web プログラミング言語です。実際のアプリケーションでは、PHP は多くの場合、データのクエリと処理を行うためにデータベースと対話する必要があります。ただし、PHP を使用してデータベースから結果を取得する場合、エンコードの問題が発生する可能性があり、文字化けが発生することがよくあります。では、PHP データベースのクエリ結果のエンコードの問題を解決するにはどうすればよいでしょうか?

PHP コーディングのヒント: 偽造防止検証機能を備えた QR コードを生成するには? PHP コーディングのヒント: 偽造防止検証機能を備えた QR コードを生成するには? Aug 17, 2023 pm 02:42 PM

PHP コーディングのヒント: 偽造防止検証機能を備えた QR コードを生成するには?電子商取引やインターネットの発展に伴い、QRコードはさまざまな業界で使用されることが増えています。 QRコードの利用にあたっては、製品の安全性を確保し、偽造を防止するために、QRコードに偽造防止検証機能を付加することが非常に重要です。この記事では、PHPを使用して偽造防止検証機能付きQRコードを生成する方法と、対応するコード例を紹介します。始める前に、次の必要なツールとライブラリを準備する必要があります: PHPQRCode: PHP

HDB3 エンコード ルールとは何ですか? HDB3 エンコード ルールとは何ですか? Aug 29, 2023 pm 01:38 PM

コーディング規則は次のとおりです: 1. 前のコードが 0 で現在のデータ ビットが 0 の場合、コードは 0; 2. 前のコードが 0 で現在のデータ ビットが 1 の場合、コードはバイポーラ パルス (+A)または - A) カウンターは 1 増加します; 3. 前のコードが 1 で現在のデータ ビットが 1 の場合、コードは 0 でカウンターは 1 増加します; 4. 前のコードが 1 の場合, 現在のデータ ビットは 0, エンコード方式はカウンタのパリティに基づいて決定されます。偶数の場合、エンコードは (+B または -B) です。奇数の場合、エンコードは 0 です。レベルとカウンタがクリアされるなどです。

See all articles