为什么需要在此代码段中使用eval()?

时间:2014-03-17 16:59:39

标签: python json eval

我目前正在使用名为" pybtsync"的API层在python中开展一个小项目。它为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(request.text)不够用呢?我在这里看到使用eval()的潜在安全问题。有什么理由我没有看到吗?

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

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

2 个答案:

答案 0 :(得分:0)

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

如果API已更新为包含JSON null或布尔值,则eval()调用也会因常规JSON响应而失败。

代码应该调用request.json()

答案 1 :(得分:0)

解释语言中的eval意味着在目标文本上调用解释器本身,换句话说,尝试将文本解析并作为程序执行。

在你的情况下,结果是json格式化“字符串”,而不是json对象,调用它上面的eval将解析字符串,从而给你一个对象,另外,json.load将返回unicode字符串,而eval不会

相关问题