Что альтернатива к execfile в Python 3?

Я поддерживаю хранимые процедуры ( MySQL имеет поддержку хранимых процедур с 5.0 ) с точки зрения безопасности - преимущества -

  1. Большинство баз данных (включая MySQL ) позволяют ограничить доступ пользователей к выполнению хранимых процедур. Четкое управление доступом к безопасности полезно для предотвращения эскалации атак привилегий. Это предотвращает возможность взлома приложений, которые могут быть запущены SQL, непосредственно из базы данных.
  2. Они абстрагируют исходный SQL-запрос из приложения, поэтому для приложения доступно меньше информации о структуре базы данных. Это затрудняет понимание людьми базовой структуры базы данных и разработку подходящих атак.
  3. Они принимают только параметры, поэтому существуют преимущества параметризованных запросов. Конечно, IMO вам все равно нужно дезинфицировать ваш вход, особенно если вы используете динамический SQL внутри хранимой процедуры.

Недостатки -

  1. Они (хранимые процедуры) трудно поддерживать и стремиться к размножению очень быстро. Это делает их проблемой.
  2. Они не очень подходят для динамических запросов - если они созданы для принятия динамического кода в качестве параметров, тогда многие преимущества сбрасываются.

325
задан ideasman42 14 January 2017 в 20:15
поделиться

4 ответа

Вы, как просто предполагается, читаете файл и должностное лицо код сами. 2to3 текущие замены

execfile("somefile.py", global_vars, local_vars)

как

with open("somefile.py") as f:
    code = compile(f.read(), "somefile.py", 'exec')
    exec(code, global_vars, local_vars)

(Вызов компиляции не строго необходим, но он связывает имя файла с объектом кода, делающим отладку немного легче.)

См.:

209
ответ дан Honest Abe 23 November 2019 в 00:51
поделиться

Вы могли записать свою собственную функцию:

def xfile(afile, globalz=None, localz=None):
    with open(afile, "r") as fh:
        exec(fh.read(), globalz, localz)

, Если Вы действительно должны были...

17
ответ дан Honest Abe 23 November 2019 в 00:51
поделиться

Если сценарий, который Вы хотите загрузить, находится в том же каталоге, чем тот, Вы выполняете, возможно, "импортируете", сделает задание?

, Если необходимо динамично импортировать, кодируют встроенную функцию __ импорт __ и модуль , на импорт стоит посмотреть.

>>> import sys
>>> sys.path = ['/path/to/script'] + sys.path
>>> __import__('test')
<module 'test' from '/path/to/script/test.pyc'>
>>> __import__('test').run()
'Hello world!'

test.py:

def run():
        return "Hello world!"

при использовании Python 3.1 или позже необходимо также смотреть на importlib.

11
ответ дан Tim Lesher 23 November 2019 в 00:51
поделиться

Этот вариант лучше, поскольку он берет глобальные и локальные переменные от вызывающего:

import sys
def execfile(filename, globals=None, locals=None):
    if globals is None:
        globals = sys._getframe(1).f_globals
    if locals is None:
        locals = sys._getframe(1).f_locals
    with open(filename, "r") as fh:
        exec(fh.read()+"\n", globals, locals)
20
ответ дан 23 November 2019 в 00:51
поделиться
Другие вопросы по тегам:

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