Как безопасно экранировать аргументы командной строки для оболочки 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
но это неправильно для меня.