Python: как получить функцию, основанную на том, соответствует ли она назначенной ей строке [duplicate]

Независимо от того, что вы делаете, убедитесь, что вы не доверяете данным, отправленным с клиента. $_SERVER['REMOTE_ADDR'] содержит реальный IP-адрес соединительной стороны. Это самое надежное значение, которое вы можете найти.

Однако они могут находиться за прокси-сервером, и в этом случае прокси-сервер может установить $_SERVER['HTTP_X_FORWARDED_FOR'], но это значение легко подделать. Например, он может быть установлен кем-то без прокси, или IP может быть внутренним IP-адресом из локальной сети за прокси-сервером.

Это означает, что если вы собираетесь сохранить $_SERVER['HTTP_X_FORWARDED_FOR'], сделайте убедитесь, что вы также сохранили значение $_SERVER['REMOTE_ADDR']. Например. сохраняя оба значения в разных полях в вашей базе данных.

Если вы собираетесь сохранить IP-адрес в базе данных в виде строки, убедитесь, что у вас есть место для не менее 45 символов. IPv6 находится здесь, чтобы остаться, и эти адреса больше, чем старые IPv4-адреса.

(Обратите внимание, что IPv6 обычно использует не более 39 символов, но есть также специальный IPv6 нотация для IPv4-адресов , которая в полной форме может содержать до 45 символов. Поэтому, если вы знаете, что делаете, вы можете использовать 39 символов, но если вы просто хотите установить и забыть, используйте 45).

62
задан Rodrigues Luis 17 August 2012 в 10:18
поделиться

8 ответов

funcdict = {
  'mypackage.mymodule.myfunction': mypackage.mymodule.myfunction,
    ....
}

funcdict[myvar](parameter1, parameter2)
92
ответ дан Ignacio Vazquez-Abrams 18 August 2018 в 20:39
поделиться
  • 1
    Интересно, что такое производительность, если функция будет называться много раз (в цикле, рекурсии и т. Д.)? – zanlok 2 February 2011 в 14:34
  • 2
    Ссылка уже решена, поэтому только поиск в пределах dict требует времени, кроме вызова локальной функции. И даже это можно смягчить, только разыскивая один раз. – Ignacio Vazquez-Abrams 7 June 2011 в 20:45
  • 3
    Что это за "mypackage.mymodule.myfunction"? Где я могу узнать больше об этом? – Orvar Korvar 15 August 2017 в 10:40
  • 4
    @OrvarKorvar: Замените имя и ссылку по вашему выбору. – Ignacio Vazquez-Abrams 15 August 2017 в 14:28
  • 5
    Ах, теперь я понимаю. fundict - словарь. – Orvar Korvar 16 August 2017 в 08:08

Почему бы не сохранить функцию самостоятельно? myvar = mypackage.mymodule.myfunction намного чище.

5
ответ дан ironfroggy 18 August 2018 в 20:39
поделиться
modname, funcname = myvar.rsplit('.', 1)
getattr(sys.modules[modname], funcname)(parameter1, parameter2)
4
ответ дан Matt Anderson 18 August 2018 в 20:39
поделиться
def f(a,b):
    return a+b

xx = 'f'
print eval('%s(%s,%s)'%(xx,2,3))

OUTPUT

 5
13
ответ дан Pratik Deoghare 18 August 2018 в 20:39
поделиться
  • 1
    Я дам преимущество, чтобы противодействовать нисходящей линии. Это может быть не лучшее решение, я думаю, что это полезный ответ, так как он показывает полный рабочий пример. – Bryan Oakley 17 February 2010 в 19:23
  • 2
    @ Брайан Окли приветствует! – Pratik Deoghare 17 February 2010 в 19:31
  • 3
    eval - дьявол, imo – zanlok 2 February 2011 в 14:35
  • 4
    @zanlok Да, это так! :-) Тогда я этого не знал. – Pratik Deoghare 3 February 2011 в 07:42
  • 5
    @zanlok Как уже было сказано, все зависит. – glglgl 2 June 2014 в 12:31

У меня возникла аналогичная проблема при создании библиотеки для проверки подлинности. Я хочу, чтобы владелец приложения, используя мою библиотеку, мог зарегистрировать обратный вызов с библиотекой для проверки авторизации в отношении групп LDAP, в которых находится аутентифицированный человек. Конфигурация передается как файл config.py, который импортируется и содержит dict с все параметры конфигурации.

Я получил это для работы:

>>> class MyClass(object):
...     def target_func(self):
...         print "made it!"
...    
...     def __init__(self,config):
...         self.config = config
...         self.config['funcname'] = getattr(self,self.config['funcname'])
...         self.config['funcname']()
... 
>>> instance = MyClass({'funcname':'target_func'})
made it!

Есть ли способ pythonic-er для этого?

1
ответ дан Rob Fagen 18 August 2018 в 20:39
поделиться

Самый простой

eval(myvar)(parameter1, parameter2)

У вас нет функции «указатель». У вас есть функция «name».

Пока это работает хорошо, у вас будет большое количество людей, говорящих вам, что это «небезопасно» или «риск для безопасности».

7
ответ дан S.Lott 18 August 2018 в 20:39
поделиться
  • 1
    Они будут «правы». – Derrick Turk 17 February 2010 в 19:12
  • 2
    ... и многие люди правы. – Triptych 17 February 2010 в 19:12
  • 3
    @schneck: Если eval («строка») не создает правильную функцию, тогда ваш вопрос неполный. Вы опустили что-то важное. Вы можете попробовать опубликовать что-то, что делает , вместе с подробным сообщением об ошибке того, что не работает. – S.Lott 17 February 2010 в 19:19
  • 4
    @Derrick Turn, @Truptych: Они были бы правы, только если бы строка исходила от злонамеренного социопата. Пользовательский вход от не прошедших проверку подлинности людей в Интернете, вероятно, будет включать злонамеренные социопаты. Большинство других случаев обычно не связаны с злонамеренными социопатами, что снижает риск безопасности до того же риска, что и у кого-то, удаляющего весь исходный код для приложения. – S.Lott 17 February 2010 в 19:20
  • 5
    @schneck, я не понимаю, что вы подразумеваете под ", так как это универсальное приложение & quot; может означать здесь. Если вы определили это как строковый литерал, вы уже достаточно знаете об этом, что вам не нужно это делать. – Mike Graham 17 February 2010 в 19:31

eval(compile(myvar,'<str>','eval'))(myargs)

compile (..., 'eval') допускает только один оператор, поэтому после вызова не может быть произвольных команд, или будет SyntaxError. Тогда крошечный бит валидации может, по крайней мере, ограничить выражение чем-то в вашей власти, например, начать тестирование «mypackage».

1
ответ дан SilverbackNet 18 August 2018 в 20:39
поделиться

Гораздо лучше иметь возможность просто сохранить функцию, поскольку они являются первоклассными объектами в python.

import mypackage

myfunc = mypackage.mymodule.myfunction
myfunc(parameter1, parameter2)

Но если вам нужно импортировать пакет динамически, тогда вы может достичь этого через:

mypackage = __import__('mypackage')
mymodule = getattr(mypackage, 'mymodule')
myfunction = getattr(mymodule, 'myfunction')

myfunction(parameter1, parameter2)

Помните, однако, что вся эта работа применима к любой области, в которой вы сейчас находитесь. Если вы не будете их упорствовать, вы не можете рассчитывать на они остаются рядом, если вы покинете местность.

34
ответ дан user 18 August 2018 в 20:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: