MST

星途 面试题库

面试题:Python json.loads反序列化的安全性考量

假设你正在使用json.loads反序列化来自不可信源的数据,可能存在哪些安全风险?如何在不影响功能的前提下,确保反序列化过程的安全性?请举例说明。
47.1万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

安全风险

  1. 代码注入风险:恶意用户可能构造包含Python代码对象的JSON数据,在反序列化时执行任意代码。例如,包含__import__('os').system('rm -rf /')类似的恶意代码,一旦执行会对系统造成严重破坏。
  2. 资源消耗攻击:攻击者可以构造非常大的JSON数据,导致反序列化时消耗大量内存、CPU资源,引发拒绝服务(DoS)攻击。

确保安全性的方法

  1. 使用object_hook限制反序列化对象:通过自定义object_hook函数,只允许特定的、安全的对象反序列化。
  2. 验证和过滤数据:在反序列化前,对JSON数据进行严格的验证和过滤,确保数据结构和内容符合预期。

示例

import json


def safe_object_hook(dct):
    # 只允许特定的键存在
    allowed_keys = ['key1', 'key2']
    for key in dct.keys():
        if key not in allowed_keys:
            raise ValueError('Invalid key in JSON data')
    return dct


try:
    malicious_json = '{"__import__(\'os\').system(\'echo malicious code\')": "value"}'
    json.loads(malicious_json, object_hook=safe_object_hook)
except ValueError as ve:
    print(f"Caught malicious data: {ve}")
except Exception as e:
    print(f"Other error: {e}")

在上述示例中,safe_object_hook函数检查JSON数据中的键是否在允许的列表中,如果不在则抛出异常,从而阻止恶意代码注入。同时,在反序列化前也可结合其他数据验证逻辑,比如检查数据类型、长度等,进一步保障反序列化的安全性。