2017-04-15 25 views
10

Mam ActiveJob który uruchamia skrypt systemu, aby uruchomić:szyny Jak uruchomić polecenie systemu z szynami dowodzić bezpiecznie

`grunt custom-job --src=files --dest="file" --vars='#{user_input_vars_from_json}'` 

Punkt istotą jest to, że

user_input_vars_from_json 

Czy config json który przychodzi jako parametr wejściowy użytkownika ze sterownika. Czy sprawdzam poprawność formatu json, ale jak mogę się upewnić, że nie ma szkodliwego kodu wysłanego do mojego polecenia systemowego?

Odpowiedz

1

Chciałbym to poprzedzić słowami: Każde wejście użytkownika powinno być traktowane jako niebezpieczne. Nie polecałbym wykonywania żadnych komend za pomocą danych wprowadzanych przez użytkownika.

Pierwszą rzeczą, którą zamierzasz zrobić, to zablokować dane wejściowe tak bardzo, jak to możliwe. Rozważ ograniczenie długości user_input_vars_from_json, aby zapobiec przepełnieniu bufora i atakom DoS. Polecam również próbę wymyślenia sposobu zarówno sprawdzania poprawności i ograniczania "vars", które próbujesz ustawić w JSON user_input_vars_from_json, aby odfiltrować niechciane klucze/wartości.

Gdy wejście jest czyszczony, można użyć Kernel#system w połączeniu z Shellwords dostać tak blisko, jak to możliwe w bezpieczny wykonujący swoją komendę z pracy:

require 'shellwords' 
system("grunt", "custom-job", "--src=files", '--dest="file"', "--vars=\"#{Shellwords.escape(user_input_vars_from_json)}\""