python中的Eval safety,从JSON中提取字符串

2024-04-19 23:02:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我在绞尽脑汁想办法利用这个装置。我的概念是:我的twisted服务器接收消息(通过LineReceiver)。消息是base64json,应该包含一个字典。{2}客户机操作}的排序应该是哪个。在

在程序的这一部分,line是通过网络接收的base64字符串。在

def Decode(line):
    return json.loads(base64.b64decode(line))

以及解释(在扭曲的Protocol对象内)

^{pr2}$

为什么我认为它是安全的:

  • 只有当我得到一个纯字符串作为值时,eval才会运行。在
  • JSON不能打包复杂的objecst,只能打包python基础知识。攻击者不应该__str__访问我收到的内容,对吗?在
  • 我使用eval来为一打if instruction["INSTRUCTION"] == "functionA": functionA(self)行提供可读性较差但更紧凑的替换。我正在运行eval从一个特定的列表中选择一个函数。在

这个安全吗?这种风格或形式是否可以接受?由于客户端不可信任,这段代码对于多人游戏是否足够健壮?(稍后验证指令是否符合游戏规则,这里我想保护我的服务器不受破坏性的修补。)

有没有更好的方法来做我正在尝试的(我想是远程执行一个函数)更标准/更安全?在


Tags: 函数字符串服务器概念消息利用evalline
1条回答
网友
1楼 · 发布于 2024-04-19 23:02:01

最好使用getattr()

if instruction and "INSTRUCTION" in instruction:
    instr_callable = getattr(self, 'do_' + instruction['INSTRUCTION'], None)
    if instr_callable is not None:
        instr_callable()

其中,do_是在指令名的前缀,以确保只有允许的方法才能通过此方法调用。在

如果指令函数位于全局命名空间中,请改用globals(),并将其用作映射:

^{pr2}$

但是,最好将这些可调用项放入显式映射中:

instr_callables = dict(
    register=register,
    join=join,
    ...
)

if instruction and "INSTRUCTION" in instruction:
    instr_callable = instr_callables.get(instruction['INSTRUCTION'], None)
    if instr_callable is not None:
        instr_callable(self)

很少需要eval()在python名称空间中查找任意对象。在

相关问题 更多 >