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
- falscprint(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^
- falscBeispiel
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.
^
und"
oder'
- falscBeispiel
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.