在Python 2.7 documentation for SimpleXMLRPCServer中,以下代码设置了服务器:
from SimpleXMLRPCServer import SimpleXMLRPCServer
from SimpleXMLRPCServer import SimpleXMLRPCRequestHandler
# Restrict to a particular path.
class RequestHandler(SimpleXMLRPCRequestHandler):
rpc_paths = ('/RPC2',)
# Create server
server = SimpleXMLRPCServer(("localhost", 8000),
requestHandler=RequestHandler)
server.register_introspection_functions()
# Register pow() function; this will use the value of
# pow.__name__ as the name, which is just 'pow'.
server.register_function(pow)
# Register a function under a different name
def adder_function(x,y):
return x + y
server.register_function(adder_function, 'add')
# Register an instance; all the methods of the instance are
# published as XML-RPC methods (in this case, just 'div').
class MyFuncs:
def div(self, x, y):
return x // y
server.register_instance(MyFuncs())
# Run the server's main loop
server.serve_forever()
我已经读过Python的XMLRPC服务器可以是vulnerable to some XML attacks,特别是“十亿笑声”,“二次爆炸”和“减压弹”。文档中的示例代码是否容易受到这些攻击,并且是否有必要采取其他措施来防止这些漏洞?我在此示例代码之后对一些客户端服务器代码进行建模,并想知道SimpleXMLRPCServer有多脆弱。如果此示例代码容易受到攻击,那么我认为我也需要在应用程序中做一些事情。
编辑:
这是我为解决XML漏洞而实施的。这是正确的吗?保护示例代码是否需要所有这些?
from SimpleXMLRPCServer import SimpleXMLRPCServer
from SimpleXMLRPCServer import SimpleXMLRPCRequestHandler
from defusedxml.xmlrpc import monkey_patch # Protects against XML vulnerabilities. See https://docs.python.org/2/library/xml.html
monkey_patch()
# Rest of code is the same as above
答案 0 :(得分:1)
这些库很容易受到XML攻击,并且(攻击的本质就是它们的本质)示例代码无法抵御攻击,因为这并不是漏洞所在:它们实际上位于库的正确位置XML规范的实现。客户端代码很难保护自己免受API调用的正确执行。
如果您担心这些问题,可以尝试使用库defusedxml
。根据{{3}}(SimpleXMLRPCServer
的Python 3版本)的文档,库defusedxml
及其朋友defusedxpat
是包含在Python 3标准库中的候选对象将来,而且现在还不仅仅因为它们会破坏向后兼容性。