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

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

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

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

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

11 techniques courantes d'encodage des caractéristiques de classification 11 techniques courantes d'encodage des caractéristiques de classification Apr 12, 2023 pm 12:16 PM

Les algorithmes d'apprentissage automatique n'acceptent que les entrées numériques, donc si nous rencontrons des caractéristiques catégorielles, nous coderons les caractéristiques catégorielles. Cet article résume 11 méthodes courantes de codage de variables catégorielles. 1. ONE HOT ENCODING La méthode d’encodage la plus populaire et la plus couramment utilisée est One Hot Enoding. Une unique variable à n observations et d valeurs distinctes est convertie en d variables binaires à n observations, chaque variable binaire est identifiée par un bit (0, 1). Par exemple : l'implémentation la plus simple après l'encodage consiste à utiliser get_dummiesnew_df=pd.get_dummies(columns=[‘Sex’], data=df)2 de pandas,

Comment désactiver en toute sécurité Windows Modules Installer Worker sur Windows 11 Comment désactiver en toute sécurité Windows Modules Installer Worker sur Windows 11 Apr 13, 2023 pm 03:43 PM

Que vous ayez un ancien ordinateur ou que vous ayez besoin que votre PC exécute plusieurs tâches simultanément, vous souhaiterez peut-être désactiver le programme d'installation des modules Windows. La raison en est que le programme d'installation des modules Windows impose une charge élevée sur votre disque, votre processeur et votre mémoire. Vous pouvez utiliser le meilleur logiciel pour corriger une utilisation élevée du processeur, mais certains rapports montrent que cela peut même occuper 100 % de l'utilisation du processeur. Même si cela peut vous aider à maintenir un système plus sécurisé et plus fiable, cela a un coût. Par conséquent, vous pouvez décider de le conserver ou de le désactiver pour éviter des problèmes de performances. Dans cet article, nous explorerons en détail ce qu'est Windows Modules Installer Worker et comment activer ou

Combien d'octets les caractères chinois codés en utf8 occupent-ils ? Combien d'octets les caractères chinois codés en utf8 occupent-ils ? Feb 21, 2023 am 11:40 AM

Les caractères chinois codés en UTF8 occupent 3 octets. En codage UTF-8, un caractère chinois équivaut à trois octets et un signe de ponctuation chinois occupe trois octets, tandis qu'en codage Unicode, un caractère chinois (y compris le chinois traditionnel) équivaut à deux octets. UTF-8 utilise 1 à 4 octets pour coder chaque caractère. Un caractère US-ASCIl n'a besoin que de 1 octet pour coder. Le latin, le grec, le cyrillique, l'arménien et l'hébreu avec des signes diacritiques, l'arabe, le syriaque et d'autres lettres nécessitent 2 octets. codage.

Knowledge graph : le partenaire idéal des grands modèles Knowledge graph : le partenaire idéal des grands modèles Jan 29, 2024 am 09:21 AM

Les grands modèles linguistiques (LLM) ont la capacité de générer un texte fluide et cohérent, ouvrant de nouvelles perspectives dans des domaines tels que la conversation par intelligence artificielle et l'écriture créative. Cependant, le LLM présente également certaines limites clés. Premièrement, leurs connaissances se limitent aux modèles reconnus à partir des données de formation, sans une véritable compréhension du monde. Deuxièmement, les capacités de raisonnement sont limitées et ne peuvent pas faire de déductions logiques ni fusionner des faits provenant de plusieurs sources de données. Face à des questions plus complexes et ouvertes, les réponses de LLM peuvent devenir absurdes ou contradictoires, ce que l'on appelle des « illusions ». Par conséquent, bien que le LLM soit très utile à certains égards, il présente néanmoins certaines limites lorsqu’il s’agit de problèmes complexes et de situations du monde réel. Afin de combler ces lacunes, des systèmes de génération augmentée par récupération (RAG) ont vu le jour ces dernières années.

Plusieurs méthodes de codage courantes Plusieurs méthodes de codage courantes Oct 24, 2023 am 10:09 AM

Les méthodes de codage courantes incluent le codage ASCII, le codage Unicode, le codage UTF-8, le codage UTF-16, le codage GBK, etc. Introduction détaillée : 1. Le codage ASCII est la première norme de codage de caractères, utilisant des nombres binaires de 7 bits pour représenter 128 caractères, y compris des lettres anglaises, des chiffres, des signes de ponctuation, des caractères de contrôle, etc. 2. Le codage Unicode est une méthode utilisée pour représenter ; tous les caractères du monde La méthode d'encodage standard des caractères, qui attribue un point de code numérique unique à chaque caractère 3. Encodage UTF-8, etc.

Comment résoudre le problème de l'encodage des résultats des requêtes de la base de données PHP Comment résoudre le problème de l'encodage des résultats des requêtes de la base de données PHP Mar 21, 2023 am 11:49 AM

PHP est un langage de programmation Web populaire qui peut être utilisé pour écrire des pages Web et des applications dynamiques. Dans les applications pratiques, PHP doit souvent interagir avec la base de données pour interroger et traiter les données. Cependant, lorsque vous utilisez PHP pour obtenir des résultats à partir d'une base de données, vous pouvez rencontrer des problèmes d'encodage, qui entraînent souvent des caractères tronqués. Alors, comment résoudre le problème de l’encodage des résultats des requêtes de la base de données PHP ?

Conseils de codage PHP : Comment générer un code QR avec fonction de vérification anti-contrefaçon ? Conseils de codage PHP : Comment générer un code QR avec fonction de vérification anti-contrefaçon ? Aug 17, 2023 pm 02:42 PM

Conseils de codage PHP : Comment générer un code QR avec fonction de vérification anti-contrefaçon ? Avec le développement du commerce électronique et d’Internet, les codes QR sont de plus en plus utilisés dans divers secteurs. Lors de l'utilisation des codes QR, afin de garantir la sécurité des produits et de prévenir la contrefaçon, il est très important d'ajouter des fonctions de vérification anti-contrefaçon aux codes QR. Cet article expliquera comment utiliser PHP pour générer un code QR avec fonction de vérification anti-contrefaçon et joindra des exemples de code correspondants. Avant de commencer, nous devons préparer les outils et bibliothèques nécessaires suivants : PHPQRCode : PHP

Comment implémenter le cryptage et le décryptage Linux base64 Comment implémenter le cryptage et le décryptage Linux base64 May 14, 2023 am 11:58 AM

1. Encodez le fichier en base64 et imprimez-le sur la sortie standard [root@pps~]#base64filec25haWx3YXJyaW9yCg== Vous pouvez également le faire : [root@pps~]#catfile|base64c25haWx3YXJyaW9yCg== 2. Lisez le contenu du fichier à partir du entrée standard, encodage en base64 et impression sur la sortie standard [root@pps~]#base64snailwarriorc25haWx3YXJyaW9yCg==3 Encodez la chaîne "snailwarrior" et imprimez sur la sortie standard [root@p.

See all articles