python - 在 Python 中检查 Parquet 文件幻数
问题描述
在 Python 中,我们可以使用方法zipfile.is_zipfile
https://docs.python.org/2/library/zipfile.html验证 zip 文件
同样,我想在使用第三方 Parquet 文件之前根据其幻数对其进行验证。有没有我可以用来验证 Parquet 文件的 API 是幻数,如果我不验证可能会带来安全风险
解决方案
通常,标识不同文件类型的幻数是文件的前四个字节。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.
关于您问题的第二部分,不检查幻数不是安全风险,因为如果攻击者可以伪造恶意文件以触发某些漏洞,他们可以在使用正确的幻字符串的同时轻松地做到这一点时间。这更像是一个问题,即您多早意识到文件存在问题以及错误消息的有用性。
例如,如果代码省略了检查魔术字节并立即开始读取页脚的偏移量,然后尝试从该偏移量读取页脚,您最终可能会收到一条不太有用的错误消息,抱怨无效的偏移量而不是一个更有用的抱怨错误的文件类型。
推荐阅读
- java - 定时器启动后可切换按钮不起作用
- group-by - Salesforce SOQL GROUP BY 是否区分不同区域设置的大小写?
- java - Does Jackson deserialization have a maximum for inhertiance depth?
- node.js - 启动 nodejs api 应用程序时的偏移错误
- java - seekbarpreference 库 com.yokkomi:seekbar-preference:1.0 返回默认值
- android - 协调器布局和其他一些布局在迁移到 androidX 后不起作用
- javascript - 使用 Ajax 发送对象数组并从 nodejs 服务器读取它
- javascript - 从里程碑更新到任务 Highcharts 甘特图
- javascript - Highchart Bubble 不显示工具提示
- android - 如何找到用于手动测试的 android 应用程序的代码覆盖率?