我在python中创建了一组XMLRPC客户端 - 服务器程序,并设置了一个用于验证我的客户端的方法。然而,在完成整个编码之后,我意识到一旦客户端被认证,我为它设置的标志在我的类中是全局的,即只要一个客户端被认证,所有客户端都被认证。我不知道为什么,但我的印象是,只要SimpleXMLRPCServer被客户端连接,它就会在我的程序中创建一组新的变量。
基本上它现在设置的方式是
class someclass:
authenticate(self, username, pass):
#do something here
if(check_for_authentication(username, pass))
self.authenticated=True
other_action(self, vars):
if authenticated:
#do whatever
else:
return "Not authorized."
server=SimpleXMLRPCServer.SimpleXMLRPCServer("0.0.0.0", 8000)
server.register_instance(someclass())
server.serve_forever()
我需要一种方法来破解我正在寻找的东西(即需要为每个连接的客户端设置经过身份验证的标志),或者另一种可以更轻松地执行此操作的协议。经过一番搜索,我一直在看扭曲,但由于这已经写好了,我宁愿修改它而不是重写它。我知道现在我总是可以从客户端获得用户名和密码,但是在最有用的资源(必须对每个请求进行身份验证)和节省带宽(我的一些客户的数量非常有限),我会而不是那样做。
此外,这是我第一次尝试保护这样的东西(我没有接受过互联网安全方面的培训),所以如果我在逻辑中忽略了一些明显的错误,请告诉我。基本上,我不能让别人在“other_actions”
中向我发送虚假变量答案 0 :(得分:0)
这样的事情会起作用:
class SomeClass(object):
authenticated = {}
def authenticate(self, username, password):
#do something here
if authenticate(username, password):
# make unique token can probably be just a hash
# of the millisecond time and the username
self.authenticated[make_unique_token(username)] = True
def other_action(self, vars):
# This will return True if the user is authenticated
# and None otherwise, which evaluates to False
if authenticated.get(vars.get('authentication-token')):
#do whatever
pass
else:
return "Not authorized."
server=SimpleXMLRPCServer.SimpleXMLRPCServer("0.0.0.0", 8000)
server.register_instance(someclass())
server.serve_forever()
您只需在登录后向其传递身份验证令牌即可。
我假设你知道你实际上不能使用pass
作为变量名。请记住接受你的问题的答案(我注意到你没有为你的最后几个问题)。
答案 1 :(得分:0)
你必须决定。如果您确实要为所有客户端使用一个实例,则必须将“已验证”状态存储在其他位置。我不熟悉SimpleXMLRPCServer(),但是如果你可以在某个地方获得连接对象,或者至少是它的源地址,你可以建立一个set(),其中所有经过身份验证的客户端/连接/任何已注册。