Heim php教程 php手册 PHP4.4.2中关于BASE64编码中的一点BUG

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

Jun 06, 2016 pm 07:46 PM
base64 um 编码

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

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

11 gängige Techniken zur Kodierung von Klassifizierungsmerkmalen 11 gängige Techniken zur Kodierung von Klassifizierungsmerkmalen Apr 12, 2023 pm 12:16 PM

Algorithmen für maschinelles Lernen akzeptieren nur numerische Eingaben. Wenn wir also auf kategoriale Merkmale stoßen, werden wir die kategorialen Merkmale kodieren. In diesem Artikel werden 11 gängige Methoden zur Kodierung kategorialer Variablen zusammengefasst. 1. ONE HOT ENCODING Die beliebteste und am häufigsten verwendete Kodierungsmethode ist One Hot Enoding. Eine einzelne Variable mit n Beobachtungen und d unterschiedlichen Werten wird in d binäre Variablen mit n Beobachtungen umgewandelt, wobei jede binäre Variable durch ein Bit (0, 1) identifiziert wird. Beispiel: Die einfachste Implementierung nach dem Codieren ist die Verwendung von pandas' get_dummiesnew_df=pd.get_dummies(columns=[‘Sex’], data=df)2,

So deaktivieren Sie den Windows Modules Installer Worker unter Windows 11 sicher So deaktivieren Sie den Windows Modules Installer Worker unter Windows 11 sicher Apr 13, 2023 pm 03:43 PM

Unabhängig davon, ob Sie einen alten Computer haben oder auf Ihrem PC viele Aufgaben gleichzeitig ausführen müssen, möchten Sie möglicherweise den Windows Modules Installer-Worker deaktivieren. Der Grund dafür ist, dass der Windows Modules Installer eine hohe Belastung für Ihre Festplatte, CPU und Ihren Speicher darstellt. Sie können die beste Software verwenden, um eine hohe CPU-Auslastung zu beheben, aber einige Berichte zeigen, dass sie sogar 100 % der CPU-Auslastung in Anspruch nehmen kann. Dies kann Ihnen zwar dabei helfen, ein sichereres und zuverlässigeres System aufrechtzuerhalten, ist jedoch mit Kosten verbunden. Daher können Sie entscheiden, es beizubehalten oder zu deaktivieren, um Leistungsprobleme zu vermeiden. In diesem Artikel werden wir im Detail untersuchen, was Windows Modules Installer Worker ist und wie man ihn aktiviert

Wie viele Bytes belegen utf8-codierte chinesische Zeichen? Wie viele Bytes belegen utf8-codierte chinesische Zeichen? Feb 21, 2023 am 11:40 AM

UTF8-kodierte chinesische Zeichen belegen 3 Bytes. Bei der UTF-8-Kodierung entspricht ein chinesisches Zeichen drei Bytes und ein chinesisches Satzzeichen belegt drei Bytes, während bei der Unicode-Kodierung ein chinesisches Zeichen (einschließlich traditionellem Chinesisch) zwei Bytes entspricht. UTF-8 benötigt zur Kodierung jedes Zeichens nur 1 Byte. Für Latein, Griechisch, Kyrillisch und Hebräisch sind 2 Byte erforderlich Codierung.

Knowledge Graph: der ideale Partner für große Modelle Knowledge Graph: der ideale Partner für große Modelle Jan 29, 2024 am 09:21 AM

Große Sprachmodelle (LLMs) sind in der Lage, flüssige und kohärente Texte zu generieren, was neue Perspektiven für Bereiche wie Konversation mit künstlicher Intelligenz und kreatives Schreiben eröffnet. Allerdings weist LLM auch einige wesentliche Einschränkungen auf. Erstens beschränkt sich ihr Wissen auf Muster, die aus Trainingsdaten erkannt werden, und es mangelt ihnen an einem echten Verständnis der Welt. Zweitens sind die Denkfähigkeiten begrenzt und können keine logischen Schlussfolgerungen ziehen oder Fakten aus mehreren Datenquellen zusammenführen. Bei komplexeren und offeneren Fragen können die Antworten von LLM absurd oder widersprüchlich werden, was als „Illusionen“ bekannt ist. Obwohl LLM in einigen Aspekten sehr nützlich ist, weist es dennoch gewisse Einschränkungen bei der Bearbeitung komplexer Probleme und realer Situationen auf. Um diese Lücken zu schließen, sind in den letzten Jahren Retrieval-Augmented-Generation-Systeme (RAG) entstanden

Mehrere gängige Kodierungsmethoden Mehrere gängige Kodierungsmethoden Oct 24, 2023 am 10:09 AM

Zu den gängigen Kodierungsmethoden gehören ASCII-Kodierung, Unicode-Kodierung, UTF-8-Kodierung, UTF-16-Kodierung, GBK-Kodierung usw. Ausführliche Einführung: 1. Die ASCII-Kodierung ist der früheste Zeichenkodierungsstandard und verwendet 7-Bit-Binärzahlen zur Darstellung von 128 Zeichen, einschließlich englischer Buchstaben, Zahlen, Satzzeichen, Steuerzeichen usw. 2. Die Unicode-Kodierung ist eine Methode zur Darstellung alle Zeichen der Welt Die Standardkodierungsmethode für Zeichen, die jedem Zeichen einen eindeutigen digitalen Codepunkt zuweist. 3. UTF-8-Kodierung usw.

So lösen Sie das Problem der Codierung von PHP-Datenbankabfrageergebnissen So lösen Sie das Problem der Codierung von PHP-Datenbankabfrageergebnissen Mar 21, 2023 am 11:49 AM

PHP ist eine beliebte Web-Programmiersprache, mit der dynamische Webseiten und Anwendungen geschrieben werden können. In praktischen Anwendungen muss PHP häufig mit der Datenbank interagieren, um Daten abzufragen und zu verarbeiten. Wenn Sie jedoch PHP verwenden, um Ergebnisse aus einer Datenbank abzurufen, kann es zu Codierungsproblemen kommen, die häufig zu verstümmelten Zeichen führen. Wie lässt sich also das Problem der Codierung von PHP-Datenbankabfrageergebnissen lösen?

PHP-Codierungstipps: Wie erstelle ich einen QR-Code mit Anti-Fälschungs-Verifizierungsfunktion? PHP-Codierungstipps: Wie erstelle ich einen QR-Code mit Anti-Fälschungs-Verifizierungsfunktion? Aug 17, 2023 pm 02:42 PM

PHP-Codierungstipps: Wie erstelle ich einen QR-Code mit Anti-Fälschungs-Verifizierungsfunktion? Mit der Entwicklung des E-Commerce und des Internets werden QR-Codes zunehmend in verschiedenen Branchen eingesetzt. Bei der Verwendung von QR-Codes ist es zur Gewährleistung der Produktsicherheit und zur Verhinderung von Fälschungen sehr wichtig, den QR-Codes Funktionen zur Fälschungssicherheit hinzuzufügen. In diesem Artikel wird die Verwendung von PHP zum Generieren eines QR-Codes mit Fälschungsschutzfunktion vorgestellt und entsprechende Codebeispiele angehängt. Bevor wir beginnen, müssen wir die folgenden notwendigen Tools und Bibliotheken vorbereiten: PHPQRCode: PHP

Was sind die HDB3-Kodierungsregeln? Was sind die HDB3-Kodierungsregeln? Aug 29, 2023 pm 01:38 PM

Die Codierungsregeln lauten: 1. Wenn der vorherige Code 0 und das aktuelle Datenbit 0 ist, ist der Code 0. Wenn der vorherige Code 0 und das aktuelle Datenbit 1 ist, ist der Code ein bipolarer Impuls (+A). oder - A) und der Zähler wird um 1 erhöht. Wenn der vorherige Code 1 ist und das aktuelle Datenbit 1 ist, ist der Code 0 und der Zähler wird um 1 erhöht 1, das aktuelle Datenbit ist 0. Die Codierungsmethode wird anhand der Parität des Zählers bestimmt. Wenn es sich um eine gerade Zahl handelt, ist die Codierung (+B oder -B). Nullniveau und der Zähler wird gelöscht und so weiter.

See all articles