2012-06-28 4 views
0

Я ищу способ использовать запрос raw_input() для выполнения кода другого объекта, чтобы гарантировать, что я делаю это безопасным способом.Python raw_input() использовать удаленное выполнение кода

У меня есть два класса, у первого есть метод, который я не должен называть, ни снаружи, ни изнутри; второй имеет метод для анализа запроса пользователя, построенного таким образом: «метод для вызова arg1 arg2 ...». Например: «Добавить 5 3». И метод «do_add» должен быть вызван с 5 и 3 в качестве аргументов.

class Obj1 : 

    # ... 

    def do_forbidden(self) : 
     # Not supposed to execute 

    # ... 

class Obj2 : 

    # ... 

    def process_cmd(self, cmd) : 
     words = cmd.split() 
     if len(words) > 0 : 
      mthdname = 'do_' + words[ 0 ] 
      args = words[1:] 

      if hasattr(self, mthdname): 
       mthd = getattr(self, mthdname) 
       mthd(*args) 

    # ... 

Тогда:

obj1 = Obj1() 
obj2 = Obj2() 
# ... 
cmd = raw_input("Command : ") 
obj2.process_cmd(cmd) 

Здесь есть способ напечатать что-то, что может выполнить "do_forbidden()" от obj1? И делает ли input() вместо raw_input() значение?

Если эксплойт действительно возможен, злоумышленник может «угадать» одно из имен методов для его выполнения, то префикс «do_» является хорошей защитой?

+0

Я использую Python 2.6, если это может быть полезно. – flzr86

ответ

2

Невозможно использовать это. Если, конечно, один из методов do_ не имеет другой уязвимости. Вы не можете выполнить метод, не определенный на том же объекте, из которого вызывается process_cmd.

input было бы совершенно другой вещью, которая позволит вам выполнить все, что угодно.

+0

Спасибо. Вы уверены, что нет странного способа выполнить что-то вроде переполнения буфера или любой другой странной вещи? – flzr86

+0

Для ввода(), я думаю, что сохранение raw_input() - хорошая идея! – flzr86

+0

Переполнение буфера, как правило, является результатом неправильного распределения памяти. Поскольку вы не делаете это вручную на Python, очень маловероятно произвести его (возможно, в расширении C, да или через модуль ctypes ...) – mata

Смежные вопросы