2010-04-27 33 views
2

J'ai une très ancienne sauvegarde .sql d'un site vbulletin que j'ai couru il y a environ 8 ans. J'essaie de voir les pièces jointes qui sont stockées dans la base de données. Le script ci-dessous les extrait tous et est vérifié pour être JPEG par hex dumping et en vérifiant les octets SOI (début de l'image) et EOI (fin de l'image) (FFD8 et FFD9, respectivement) selon le JPEG wiki page.Suis-je correctement extraire les données binaires JPEG de cette mysqldump?

Mais lorsque je tente de les ouvrir avec Evince, je reçois ce message « Erreur d'interprétation fichier image JPEG (JPEG flux de données ne contient pas d'image) »

Que pourrait se passer ici?

Quelques informations de fond:

  • sqldump est d'environ 8 ans
  • vbulletin 2.x est le logiciel qui a stocké les informations
  • très probablement PHP 4 a été utilisé
  • mysql très probablement 4.0 , peut-être même 3.x
  • le type de données de colonne dans lequel ces pièces jointes sont stockées est mediumtext

Mon scénario Python 3.1:

#!/usr/bin/env python3.1 

import re 

trim_l = re.compile(b"""^INSERT INTO attachment VALUES\('\d+', '\d+', '\d+', '(.+)""") 
trim_r = re.compile(b"""(.+)', '\d+', '\d+'\);$""") 
extractor = re.compile(b"""^(.*(?:\.jpe?g|\.gif|\.bmp))', '(.+)$""") 

with open('attachments.sql', 'rb') as fh: 
    for line in fh: 
     data = trim_l.findall(line)[0] 
     data = trim_r.findall(data)[0] 
     data = extractor.findall(data) 
     if data: 
      name, data = data[0] 
      try: 
       filename = 'files/%s' % str(name, 'UTF-8') 
       ah = open(filename, 'wb') 
       ah.write(data) 
      except UnicodeDecodeError: 
       continue 
      finally: 
       ah.close() 

fh.close() 

mise à jour La page wiki JPEG dit octets FF sont des marqueurs de section, avec l'octet suivant indiquant le type de section. Je vois certains qui ne sont pas répertoriés dans la page wiki (en particulier, je vois beaucoup de 5C octets, donc FF5C). Mais la liste est de "marqueurs communs" alors j'essaie de trouver une liste plus complète. Toute orientation ici serait également appréciée.

Répondre

1

Mettez à jour votre question avec un exemple d'instruction SQL, y compris quelques lignes/octets de la valeur de chaîne JPEG. Peut-être que les données sont encodées en base64, ou même en hexadécimal. Nous vous aiderons plus loin.

En outre, il est plus facile de voir le type de contenu d'un fichier en publiant un:

file yourfile.jpg