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

0 投票
1 回答
687 浏览
提问于 2025-04-16 11:35

我正在用 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 头。

要解决这个问题,请按照以下步骤操作:

  1. 在读取响应时,获取它的 X-Transmission-Session-Id 头,并记住它。
  2. 将更新后的头添加到你发出的请求中。
  3. 当你收到这个 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

撰写回答