gpt4 book ai didi

python - 从不受信任的来源安全地序列化数据和解包

转载 作者:太空狗 更新时间:2023-10-29 21:47:06 26 4
gpt4 key购买 nike

我使用 Pyramid 作为回合制视频游戏数据传输的基础。客户端使用 POST 数据来呈现他们的操作,并使用 GET 来检索序列化的游戏板数据。游戏数据有时可能涉及字符串,但几乎总是两个整数和两个元组:

gamedata = (userid, gamenumber, (sourcex, sourcey), (destx, desty))

我的一般客户端框架是 Pickle,转换为 base 64,使用 urlencode,然后提交 POST。服务端收到POST,解包单项字典,解码base64,然后unpickles数据对象。

我想使用 Pickle,因为我可以使用类和值。将游戏数据作为 POST 字段提交只能给我字符串。

但是,Pickle 被认为是不安全的。因此,我求助于 pyYAML,它具有相同的目的。使用 yaml.safe_load(data),我可以在不暴露安全漏洞的情况下序列化数据。然而,safe_load 非常安全,我什至无法反序列化无害的元组或列表,即使它们只包含整数。

这里有中间立场吗?有没有一种方法可以序列化 python 结构,同时不允许执行任意代码?

我的第一个想法是为我的发送和接收函数编写一个包装器,在值名称中使用下划线来重新创建元组,例如发送会将字典值 source : (x, y) 转换为 source_0 : x, source_1: y。我的第二个想法是,这不是一个非常明智的发展方式。

编辑:这是我使用 JSON 的实现...它似乎不如 YAML 或 Pickle 强大,但我仍然担心可能存在安全漏洞。

在我进行实验时,客户端的构造更加明显:

import urllib, json, base64

arbitrarydata = { 'id':14, 'gn':25, 'sourcecoord':(10,12), 'destcoord':(8,14)}

jsondata = json.dumps(arbitrarydata)
b64data = base64.urlsafe_b64encode(jsondata)
transmitstring = urllib.urlencode( [ ('data', b64data) ] )
urllib.urlopen('http://127.0.0.1:9000/post', transmitstring).read()

Pyramid Server 可以检索数据对象:

json.loads(base64.urlsafe_b64decode(request.POST['data'].encode('ascii')))

顺便说一句,我很想听听其他一些关于在这种方法中使用 POST 数据的可接受性的意见,我的游戏客户端目前绝不是基于浏览器的。

最佳答案

json怎么样? ?该库是标准 Python 库的一部分,它允许序列化大多数通用数据,而无需执行任意代码。

关于python - 从不受信任的来源安全地序列化数据和解包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12770796/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com