Wie kann ich Befehlszeilenargumente für die cmd.exe-Shell unter Windows sicher umgehen?

Ok, ich habe einen Befehl, der in @ ausgeführt werden mushell=True mode.

os.system odersubprocess.Popen(..., shell=True)

Und dieser Befehl enthält eine Zeichenfolgensubstitution wie:cmd = "some_secret_command {0}".format(string_from_user)

Ich will entkommenstring_from_user Variable, um jegliche Injektionen zu verhindern.

Einfache falsche Antworten:

Verwendenshlex.quote - falsc

print(shlex.quote('file.txxt; &ls . #')) ->'file.txxt; &ls . #' (Injektion)

Beispiel

> python -c "import sys; print(sys.argv[1])" 'file.txxt; &ls . #'
secret.txt
secret2.txt
Use escape^ - falsc

Beispiel

import os

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

Jetzt kann ich @ verwend (Leerzeichen) und füge mehr als ein Argument ein.

Verwenden^ und" oder' - falsc

Beispiel

import os

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

drucken^s^o^m^e^ ^a^r^g^ ^w^i^t^h^ ^s^p^a^c^e^s^

und wenn'

import os

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

drucken'some

ch jetzt übershell=False aber das ist falsch für mich.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage