Как Вы препятствуете тому, чтобы пользователь открыл программу?

Во-первых, xargs не может работать здесь, потому что замены были бы выполнены в подпроцессе ( bash процессы это xargs запуски). Но только переменные среды передаются подпроцессам, не окружают переменные. Очевидно HOSTNAME уже был в среде Вашего сценария, когда она запустилась, но HOSTADDRESS не. В этой точке Вы могли бы испытать желание экспортировать все переменные, но даже затем xargs не хорошее решение, потому что оно страдает от многочисленного − проблем заключения в кавычки, если Ваш шаблон содержит \"' или если Вы хотите сохранить пробел, Вы - тост.

Теперь, смотря на Ваш текущий код: MESSAGE=`eval echo $TEMPLATE` сложный способ записать eval MESSAGE=$TEMPLATE, за исключением заключения в кавычки проблем. И у Вас действительно есть проблемы заключения в кавычки; например, Вы заметите, что весь Ваш пробел был свернут. Вы услышали о Bobby Tables, не так ли? Правила расширения Shell довольно сложны, но существуют некоторые правила, это сохранит Вас нормальными:

  • Всегда двойные кавычки вокруг подстановок переменных "$foo" и замены команды "$(bar)". Можно нарушить это правило, если Вы понимаете, почему необходимо опустить кавычки.
  • Использовать $(…) вместо `…` для замен команды. Заключение в кавычки в форме одинарной левой кавычки является тайным и не портативным, тогда как заключение в кавычки внутри $(…) работы обычно.
  • Использовать eval только если нажатый под прицелом. Если Вы делаете, очень осторожны, и делаете его максимально простым.

Таким образом, что может пойти не так, как надо с eval MESSAGE="$TEMPLATE"? Это заставляет оболочку оценить

MESSAGE=Hostname     : $HOSTNAME
Host Address : $HOSTADDRESS

Ой, нам нужны кавычки вокруг части, которая должна быть значением MESSAGE. Кавычки должны добраться до eval, таким образом, они должны пойти буквально через первую стадию расширения оболочки: eval MESSAGE="\"$TEMPLATE\"".

MESSAGE="Hostname     : $HOSTNAME
Host Address : $HOSTADDRESS"

Лучше, но теперь у Вас есть точно шаблон инжекции Bobby Tables — что, если шаблон содержит кавычку? Затем необходимо выйти из кавычек. Четыре символа, которые имеют особое значение между двойными кавычками, \"$`, и Вы хотите $ для сохранения его значения поэтому добавьте обратную косую черту перед другими тремя.

TEMPLATE=$(sed -e 's/[\\"`]/\\&/g' 

Теперь оболочка оценит

MESSAGE="Hostname     : $HOSTNAME
Host Address : $HOSTADDRESS
Name         : Bobby \"drop\" O'Tables"

и все хорошо.

Обратите внимание, что надлежащее заключение в кавычки здесь должно защитить от случайных проблем парсинга; кто бы ни управляет шаблоном, все еще имеет доступ оболочки (с $(hello)).

Если бы Вы хотели шаблон, включенный в Ваш сценарий оболочки, то это было бы естественно сделано с heredoc.

MESSAGE=$(cat <

Но с внешним шаблоном необходимо было бы сделать два шага оценки, следовательно использовать eval, и парсинг удара довольно ошибочен когда дело доходит до броского материала как heredocs внутри eval. Существует, конечно, путь, который работает, по крайней мере, с ударом 4, но я не рекомендую рискнуть им.

1
10.04.2012, 16:25
1 ответ

Существует несколько методов:

  1. Удалите исполняемые файлы, которые Вы хотите ограничить от локальной системы хранения на всех рабочих станциях и сделать их доступными только на сетевом диске, которым Вы управляете

  2. Используйте политику SELinux ограничить выполнение на рабочую станцию

  3. Предельный доступ к портам, IP-адресам или другим ресурсам, что незаконным исполняемым файлам нужны прокси использования или просто iptables

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

2
27.01.2020, 23:39

Теги

Похожие вопросы