面试题答案
一键面试安全风险
- 代码注入风险:恶意用户可能构造包含Python代码对象的JSON数据,在反序列化时执行任意代码。例如,包含
__import__('os').system('rm -rf /')
类似的恶意代码,一旦执行会对系统造成严重破坏。 - 资源消耗攻击:攻击者可以构造非常大的JSON数据,导致反序列化时消耗大量内存、CPU资源,引发拒绝服务(DoS)攻击。
确保安全性的方法
- 使用object_hook限制反序列化对象:通过自定义
object_hook
函数,只允许特定的、安全的对象反序列化。 - 验证和过滤数据:在反序列化前,对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数据中的键是否在允许的列表中,如果不在则抛出异常,从而阻止恶意代码注入。同时,在反序列化前也可结合其他数据验证逻辑,比如检查数据类型、长度等,进一步保障反序列化的安全性。