我在python中使用xmlrpclib连接到验证csrf令牌的xml-rpc服务器。
proxy = ServerProxy("http://127.0.0.1:9091/transmission/rpc/")
proxy.system.listMethods()
我收到以下异常
ProtocolError: <ProtocolError for 127.0.0.1:9091/transmission/rpc/: 409 Conflict>
当尝试从浏览器访问同一个xml-rpc服务器时,我收到以下错误消息。
您的请求的会话ID无效 报头中。
要解决此问题,请按以下步骤操作:
- 读取响应时,获取其X-Transmission-Session-Id标头和 记住它
- 将更新后的标头添加到外发请求中
- 当您收到此409错误消息时,请使用以下命令重新发送您的请求 更新标题
醇>此要求已添加到 有助于防止CSRF攻击。
X-传输会话Id: lhfIlFPd1W6pctlHSiS3BuNXdFr0al1qxfM4wSLvVkdh5wOu
现在,每当我使用ServerProxy对象来调用远程过程时,我正在寻找一种方法将此会话ID发送到服务器。有可能吗?
答案 0 :(得分:1)
首先,Transmission不公开XML-RPC服务。这是一个JSON-RPC服务。使用xmlrpclib根本不起作用。
您需要完全按照错误消息所说的内容...每当收到409错误时,从响应头记录X-Transmission-Session-Id,然后使用X-Transmission-Session重新发送请求-Id已添加到请求标头中。实现此目的的一种方法是使用httplib。
传输的RPC服务期望请求正文中有效的JSON。您可以在此处找到规范:https://trac.transmissionbt.com/browser/trunk/extras/rpc-spec.txt