为什么在这个代码段中需要eval()?

2024-10-01 09:19:37 发布

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

我目前正在用python开发一个小项目,使用一个名为“pybtsync”的API层,它为BTSync提供了直接的python访问。我试图通过查看它的源代码来熟悉它,我发现:

def _request_function(self, method_name, arguments='', key=None):
    URL = 'http://' + self._address + ':' + self._port +'/api?method=' + method_name + '&' + arguments
    request = requests.get(URL, auth=(self._login, self._password))
    request_data = eval(request.text)
    if key is not None:
        return request_data[key]
    return request_data

我知道BTsync的API以json格式返回。那为什么不是json.load文件(请求.text)不够?我发现在这里使用eval()有一个潜在的安全问题。有什么理由我不明白吗?你知道吗

pybtsync的全部代码可以在这里找到: https://github.com/tiagomacarios/pybtsync/blob/master/pybtsync/pybtsync.py#L239

有关BTSync api的更多上下文: http://www.bittorrent.com/sync/developers/api


Tags: keynameselfnoneapihttpurldata
2条回答

是的,这是一个安全问题;如果我可以更改您的代码使用的DNS服务器或使用中间人服务器,那么我可以向您发送任意Python代码。你知道吗

如果API被更新为包含JSONnull或布尔值,那么对于常规JSON响应,eval()调用也会失败。你知道吗

代码应该改为调用request.json()。你知道吗

解释语言中的eval是指在目标文本上调用解释器本身,即试图将文本作为程序进行解析和执行。你知道吗

在您的例子中,结果是json格式的“string”,而不是json对象,对其调用eval将解析字符串,从而为您提供一个对象,json.load文件将返回unicode字符串,而eval不会

相关问题 更多 >