在XML-RPC服务器上创建逻辑连接并调用验证CSRF令牌的程序 - python xmlrpclib
我正在用 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 服务器时,出现了以下错误信息。
你的请求中有一个无效的 session-id 头。
要解决这个问题,请按照以下步骤操作:
- 在读取响应时,获取它的 X-Transmission-Session-Id 头,并记住它。
- 将更新后的头添加到你发出的请求中。
- 当你收到这个 409 错误信息时,使用更新后的头重新发送你的请求。
这个要求是为了帮助防止 CSRF 攻击。
X-Transmission-Session-Id: lhfIlFPd1W6pctlHSiS3BuNXdFr0al1qxfM4wSLvVkdh5wOu
现在,我想知道在每次使用 ServerProxy 对象调用远程过程时,如何将这个 session-id 发送给服务器。这可能吗?
1 个回答
1
首先,Transmission并不是提供XML-RPC服务,而是提供JSON-RPC服务。所以用xmlrpclib是完全不行的。
你需要按照错误信息的提示来做……每当你收到409错误时,要记下响应头中的X-Transmission-Session-Id,然后在重新发送请求时,把这个X-Transmission-Session-Id加到请求头里。实现这个的一个方法是使用httplib。
Transmission的RPC服务在请求的主体中期待有效的JSON格式。你可以在这里找到相关的规范:https://trac.transmissionbt.com/browser/trunk/extras/rpc-spec.txt