我是否正确提取了这个mysqldump中的JPEG二进制数据?

2 投票
1 回答
1015 浏览
提问于 2025-04-15 22:05

我有一个很旧的 .sql 备份,里面是我大约 8 年前运行的 vbulletin 网站的数据。我想查看存储在数据库中的文件附件。下面的脚本可以提取所有附件,并且通过十六进制转储来验证它们是 JPEG 格式的,检查了图像的开始(SOI)和结束(EOI)字节(分别是 FFD8 和 FFD9),这些信息可以在JPEG 维基页面上找到。

但是,当我尝试用 evince 打开这些文件时,出现了这个错误信息:“解析 JPEG 图像文件时出错(JPEG 数据流不包含图像)”。

这可能是什么原因呢?

一些背景信息:

  • 这个 sqldump 大约有 8 年的历史
  • 存储这些信息的软件是 vbulletin 2.x
  • 很可能使用的是 php 4
  • 很可能使用的是 mysql 4.0,甚至可能是 3.x
  • 这些附件存储的列数据类型是 mediumtext

我的 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()

更新 JPEG 维基页面提到 FF 字节是段标记,接下来的字节表示段的类型。我看到一些不在维基页面上的字节(特别是,我看到很多 5C 字节,也就是 FF5C)。不过,那个列表只是“常见标记”,所以我想找一个更完整的列表。如果有任何建议,我也会很感激。

1 个回答

1

请在你的问题中添加一个示例的SQL语句,并附上一些JPEG字符串值的几行或几字节。可能这些数据是经过base64编码的,或者是直接的十六进制值。我们会进一步帮助你。

另外,通过执行以下命令,可以更容易地查看文件内容的类型:

file yourfile.jpg

撰写回答