在验证CSRF令牌的XML-RPC服务器上创建逻辑连接和调用过程 - python xmlrpclib

时间:2011-02-10 18:52:06

标签: python xml-rpc

我在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无效   报头中。

     

要解决此问题,请按以下步骤操作:

     
      
  1. 读取响应时,获取其X-Transmission-Session-Id标头和   记住它
  2.   
  3. 将更新后的标头添加到外发请求中
  4.   
  5. 当您收到此409错误消息时,请使用以下命令重新发送您的请求   更新标题
  6.         

    此要求已添加到   有助于防止CSRF攻击。

         

    X-传输会话Id:   lhfIlFPd1W6pctlHSiS3BuNXdFr0al1qxfM4wSLvVkdh5wOu

现在,每当我使用ServerProxy对象来调用远程过程时,我正在寻找一种方法将此会话ID发送到服务器。有可能吗?

1 个答案:

答案 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