Как безопасно экранировать аргументы командной строки для оболочки cmd.exe в Windows?

Хорошо, у меня есть команда, которая ДОЛЖНА быть выполнена вshell=True Режим.

os.system или жеsubprocess.Popen(..., shell=True)

И эта команда содержит подстановку строк, например:cmd = "some_secret_command {0}".format(string_from_user)

Я хочу сбежатьstring_from_user переменная, чтобы предотвратить любые инъекции.

Простые неправильные ответы:

использованиеshlex.quote - неверно

print(shlex.quote('file.txxt; &ls . #')) ->'file.txxt; &ls . #' (Инъекция)

Пример:

> python -c "import sys; print(sys.argv[1])" 'file.txxt; &ls . #'
secret.txt
secret2.txt
Используйте побег^ - неверно

Пример:

import os

CMD = '''string with spaces'''.replace('', '^').replace('^"', '')
os.system('python -c "import sys; print(sys.argv[1])" {0}'.format(CMD))

Теперь я могу использовать (пробел) и ввести более одного аргумента.

использование^ а также" или же' - неверно

Пример:

import os

CMD = '''some arg with spaces'''.replace('', '^').replace('^"', '')
os.system('python -c "import sys; print(sys.argv[1])" "{0}"'.format(CMD))

Распечатать^s^o^m^e^ ^a^r^g^ ^w^i^t^h^ ^s^p^a^c^e^s^

и если'

import os

CMD = '''some spaces'''.replace('', '^').replace('^\'', '')
os.system('python -c "import sys; print(sys.argv[1])" \'{0}\''.format(CMD))

Распечатать'some

Я сейчас оshell=False но это неправильно для меня.

Ответы на вопрос(1)

Ваш ответ на вопрос