在Python中检查Parquet File幻数

时间:2019-02-26 20:13:13

标签: python parquet pyarrow

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

类似地,我想在使用前根据其魔幻数字验证第三方Parquet File。是否有可用于基于幻数来验证Parquet File的API,如果我不验证,可能会带来安全风险

1 个答案:

答案 0 :(得分:2)

通常,标识不同文件类型的幻数是文件的前四个字节。 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.

关于问题的第二部分,不检查幻数不构成安全风险,因为如果攻击者可以出于触发某些漏洞的目的伪造恶意文件,那么他们可以在使用正确的幻数字符串的情况下轻松地做到这一点。同时。这更像是一个问题,您多早意识到文件存在问题以及错误消息的有用性。

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