Ruby-Flucht-ARGV-argument oder einen string als argument für shell-Befehl
Ok das macht mich verrückt:
`ls #{"/media/music/Miles Davis"}`
schlägt fehl, da der Raum zwischen "Km" und "Davis"
Sagen, ich schreiben Sie ein ruby-script und einen Benutzer übergibt Datei-Pfad als argument. Wie kann ich entkommen und Futter zu einem shell-Befehl aus. Ja, ja, ich weiß, Beschuss aus, sollten vermieden werden. Aber das ist ein erfundenes Beispiel, ich muss noch dies.
Ich tun würde system("ls", ARGV[0])
ist, aber es nicht zurückgeben, die stdout Ausgabe von ls als string, das ist, was backticks gut tun.
Wie Flucht, was auch immer Sie legen in einem shellout?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden
require 'shellwords'
undShellwords.escape
, die beheben diese Art von Sachen für Sie:http://apidock.com/ruby/Shellwords/shellescape
String#shellescape
wie diese:ls #{"/media/music/Miles Davis".shellescape}
Bleiben Sie Weg von Gebäudehülle strings, Wann immer möglich, ist es eine feine Vektor für die Ausführung von beliebigem code.
In diesem Fall könnten Sie
popen
, die nicht die Flucht für Sie:IO.popen(["file", "--brief", "--mime-type", untrustworthy_input], in: :close, err: :close).read
Doppelten Anführungszeichen funktioniert auch:
oder
a = '-l" | wc -l #"';
ls "#{a}"
"
,$
oder mehrere andere Zeichen.