检查 Python 中的 Parquet 文件幻数

Check Parquet File Magic Number in Python

在 Python 中,我们可以使用方法 zipfile.is_zipfile 验证 zip 文件 https://docs.python.org/2/library/zipfile.html

同样,我想在使用第三方 Parquet 文件之前根据其幻数验证它。是否有 API 我可以用来验证基于幻数的 Parquet 文件,如果我不验证

可能存在安全风险

通常,识别不同文件类型的幻数是文件的前四个字节。 Parquet 也是如此,但 Parquet 还会在文件末尾写入魔术字节,因此您可以检查其中一个(或两者)。两个位置的魔术字符串是 "PAR1".

您可以手动执行此操作,但如果您使用的是 pyarrow,Parquet 文件的验证会自动在幕后进行。您可以通过一个简单的实验来验证这一点。首先,尝试加载一个实际的 Parquet 文件:

>>> import pyarrow.parquet as pq
>>> parquet_file = pq.ParquetFile('data.parquet')

此操作成功,您可以以任何方式使用 parquet_file,例如以 parquet_file.metadata 访问其元数据。另一方面,如果你尝试打开一个非 Parquet 文件,你会得到一个错误:

>>> parquet_file = pq.ParquetFile('/etc/crontab')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/zi/.local/lib/python2.7/site-packages/pyarrow/parquet.py", line 128, in __init__
    self.reader.open(source, use_memory_map=memory_map, metadata=metadata)
  File "pyarrow/_parquet.pyx", line 640, in pyarrow._parquet.ParquetReader.open
  File "pyarrow/error.pxi", line 83, in pyarrow.lib.check_status
pyarrow.lib.ArrowIOError: Invalid parquet file. Corrupt footer.

关于你问题的第二部分,不检查幻数不是安全风险,因为如果攻击者可以伪造恶意文件以触发某些漏洞,他们可以在使用正确的方法时轻松地做到这一点同时魔法弦。这更像是一个问题,你多早意识到文件有问题,错误信息会有多大用处。

例如,如果代码忽略了对魔术字节的检查,并立即从读取页脚的偏移量开始,然后尝试从该偏移量读取页脚,您可能会得到一条不太有用的错误消息抱怨无效的偏移量而不是抱怨错误的文件类型更有用。