2016-08-20 7 views
0

Я пишу сценарий bash, который требует нескольких частей ввода пользователя, прежде всего путей к каталогам и имен файлов. Программа создаст указанные каталоги и файлы.Безопасная проверка ввода в скрипте Bash/Shell

При написании пути к каталогу, я прошу абсолютный путь - ~/DIR/... или $ PATH/DIR/... или ./DIR/... не разрешен , пути каталогов должны предоставляться только в виде /DIR/DIR/..., пути к файлам в виде /DIR/DIR/.../filename и имена файлов в виде файла . Я также хочу заверить, что пользователь не добавил никаких параметров в командной строке (например, если я запустил sudo, я хочу заверить, что пользователь не добавил -u в любом месте своего заявления) на их вклад.

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

Пользовательский ввод собран через . Я использую систему Ubuntu, поэтому, если она соответствует оболочке Ubuntu, она будет работать. Предположим, что установлены только системные пакеты по умолчанию.

Возможны несколько вариантов обработки отдельных разделов проверки (например, с использованием -- для обработки следующих данных как параметра, а не команды [предложенной Siguza], а затем еще одной опции для обработки путей к каталогам).

Для правильного отображения структуры каталогов требуются абсолютные пути. Любой другой формат пути заставит программу некорректно интерпретировать структуру при сопоставлении или добавлении к другим путям из-за функций, которые я выполняю на строках путей.

спасибо.


Что сработало: я использовал принятый ответ, используя Realpath в некоторых ситуациях и readlink, и с помощью - интерпретировать следующий текст в качестве параметров. Если вы хотите разрешить относительные пути, используйте результат readlink или realpath как ваш путь. Если вы хотите запретить относительные пути, сравните исходную строку с результатом readlink или realpath.

+3

Большинство команд поддерживают опцию '-', которая позволяет им обрабатывать все следующие параметры в качестве аргументов, а не опции/флаги. Кроме того, приложите все переменные в двойные кавычки, чтобы избежать расширения. – Siguza

+0

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

+0

Re: «пользователь может целые пути каталога в формате, который моя программа не может принять. Мне нужно либо отклонить недопустимый ввод, либо привести его к допустимому вводу»: * Или * вы можете изменить свою программу, чтобы принимать такие форматы. , , – ruakh

ответ

2

Вы могли бы сделать что-то вроде этого:

#!/bin/bash 

set -e  

while read path; do 
    result=`realpath -m -- "$path"` 
    if [ "$result" != "$path" ] && [ "$result/" != "$path" ] ; then 
     echo "Rejected: $path" 
    else 
     last_char_index=$((${#path}-1)) 
     last_char=${path:$last_char_index:1} 
     if [ "$last_char" == "/" ]; then 
      echo "New directory: $path" 
      mkdir -- "$path" 
     else 
      echo "New file: $path" 
      touch -- "$path" 
     fi 
    fi 
done 

exit 0 

Я использую realpath поймать относительные пути, затем всегда ввод использования пользователя между двойными кавычками, чтобы избежать команд инъекции (если это возможно). Я думаю, что есть лучшие способы сделать, но на данный момент это все, о чем я могу думать.

Edit: в соответствии с рекомендациями в комментариях, я добавил -- обеспечить имена файлов/каталогов безопасно дано touch, mkdir и realpath.

+2

Цитирующие переменные не мешают анализировать их как параметры. Для этого используйте '--'. – Siguza

+0

@Siguza Не могли бы вы привести пример, где этот сценарий небезопасен? – yoones

+2

Я никогда не говорил, что он можно использовать, но вы можете установить путь = '-X' и иметь катастрофу realpath по недопустимой опции. Вы также должны «set -e;», иначе вы могли бы установить path = '' '', и, поскольку сообщения об ошибках печатаются в stderr, а не stdout, realpath будет сбой, но блок' else' будет выполнен. Опять же, нельзя использовать, но, вероятно, нежелательно. – Siguza

 Смежные вопросы

  • Нет связанных вопросов^_^