我目前正在用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
是的,这是一个安全问题;如果我可以更改您的代码使用的DNS服务器或使用中间人服务器,那么我可以向您发送任意Python代码。你知道吗
如果API被更新为包含JSON
null
或布尔值,那么对于常规JSON响应,eval()
调用也会失败。你知道吗代码应该改为调用
request.json()
。你知道吗解释语言中的eval是指在目标文本上调用解释器本身,即试图将文本作为程序进行解析和执行。你知道吗
在您的例子中,结果是json格式的“string”,而不是json对象,对其调用eval将解析字符串,从而为您提供一个对象,json.load文件将返回unicode字符串,而eval不会
相关问题 更多 >
编程相关推荐