То, что вы делаете, опасно. Рассмотрим такие вещи:
danger = 'antisocial tendencies" $(ls) "'
`echo "#{danger}"`
и подумайте, что еще можно сделать, кроме запуска ls
.
Вы можете использовать Shellwords
(как в Как экранировать строки для терминала в Ruby? ), но это будет означать следующее:
- Используйте
Shellwords
, чтобы убежать params['phrase']
.
- Использование строковой интерполяции для построения командной строки.
- Передайте эту командную строку бэкстикам.
- Выполнить оболочку.
- Пусть оболочка проанализирует только что созданную вами командную строку.
- Получить оболочку для запуска
espeak
с нужным аргументом.
Этого можно избежать, используя инструменты из Open3
или форму с несколькими аргументами Kernel#system
, чтобы перейти непосредственно к шагу (6) без использования оболочки.
В оболочке возникают проблемы с цитированием, поэтому использование оболочки не является удобным способом устранения целого класса ошибок и уязвимостей. Избежание оболочки также более эффективно (хотя вас трудно заметить) и гибко в качестве бонуса.
Спасибо sakurashinken за поиск дубликатов, на которые я ссылался выше, позор, что вы удалили свой ответ.