Опасно ли использовать параметр, передаваемый пользователем, как часть команды оболочки, выполняемой на стороне сервера? - PullRequest
0 голосов
/ 03 мая 2018

У меня есть приложение rails с таким интерфейсом:

<%= form_tag 'sound/speak', remote: true do %>
  <input type='text' name='phrase'>
  <%= submit_tag 'Say' %>
<% end %>

Который отправляет запрос контроллеру:

  def speak
    `espeak "#{params['phrase']}"`
  end

Это работает, но разве это плохая идея с точки зрения безопасности? Я просто пытаюсь заставить свой сервер (Raspberry Pi) говорить все, что я пишу в текстовое поле. Однако в будущем это может быть использовано группой друзей. В этом случае мне нужно убедиться, что невозможно, скажем, избежать кавычек и команды «сказать» и выполнить вредоносный скрипт / команду на сервере. Итак, я в безопасности с этим кодом?

1 Ответ

0 голосов
/ 03 мая 2018

То, что вы делаете, опасно. Рассмотрим такие вещи:

danger = 'antisocial tendencies" $(ls) "'
`echo "#{danger}"`

и подумайте, что еще можно сделать, кроме запуска ls.

Вы можете использовать Shellwords (как в Как экранировать строки для терминала в Ruby? ), но это будет означать следующее:

  1. Используйте Shellwords, чтобы убежать params['phrase'].
  2. Использование строковой интерполяции для построения командной строки.
  3. Передайте эту командную строку бэкстикам.
  4. Выполнить оболочку.
  5. Пусть оболочка проанализирует только что созданную вами командную строку.
  6. Получить оболочку для запуска espeak с нужным аргументом.

Этого можно избежать, используя инструменты из Open3 или форму с несколькими аргументами Kernel#system, чтобы перейти непосредственно к шагу (6) без использования оболочки.

В оболочке возникают проблемы с цитированием, поэтому использование оболочки не является удобным способом устранения целого класса ошибок и уязвимостей. Избежание оболочки также более эффективно (хотя вас трудно заметить) и гибко в качестве бонуса.


Спасибо sakurashinken за поиск дубликатов, на которые я ссылался выше, позор, что вы удалили свой ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...