Python Server для нескольких клиентов с или без XMLRPC - PullRequest
0 голосов
/ 08 августа 2011

Я сделал набор клиент-серверных программ XMLRPC на python и настроил небольшой метод для аутентификации моих клиентов.Тем не менее, после написания практически всего этого, я понял, что после аутентификации клиента установленный для него флаг становится глобальным в моем классе, то есть, пока один клиент проходит проверку подлинности, все клиенты проходят проверку подлинности.Я не знаю почему, но у меня сложилось впечатление, что всякий раз, когда 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"

Ответы [ 2 ]

0 голосов
/ 08 августа 2011

Вы должны решить. Если вы действительно хотите использовать один экземпляр для всех клиентов, вы должны хранить «аутентифицированное» состояние в другом месте. Я не знаком с SimpleXMLRPCServer (), но если вы могли бы получить объект соединения где-нибудь или, по крайней мере, его адрес источника, вы могли бы установить set (), где все аутентифицированные клиенты / соединения / все, что зарегистрировано.

0 голосов
/ 08 августа 2011

Примерно так будет работать:

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 в качестве имени переменной. Пожалуйста, не забудьте принять ответы на ваши вопросы (я заметил, что вы не ответили на последние несколько).

...