getCGIparm(1) FreeBSD General Commands Manual getCGIparm(1) NAME getCGIparm -- Безопасный ввод параметров в cgi скриптах SYNOPSIS getCGIparm [-aAEhiHnNpPrtxxx] [-c Message] [-f MessageFile] [-e SwitchFile] [-q Quoting] [-w SubctituteString] [-z SubctituteString] тип [имя] DESCRIPTION Проверяет переменную среды после декодирования QUERY_STRING на соответ- ствие тип и если соответствует, то выводит декодированную строку на стан- дартный вывод. Если имя не задано, тогда вся строка после декодирования QUERY_STRING должна содержать значение заданного типа. Если имя задано, то предполагается, что искомая строка находится во множестве пар имя=значение разделенных знаком &, как это обычно получается при заполне- нии форм в HTML. На момент написания руководства распознавались следующие типы: any без ограничений на параметр. кои8 символы в KOI8-R. Эффективно для борьбы с переключением отдедь- ных HTTP клиентов в неправильную кодировку при вводе странных символов. КОИ8 Синоним кои8. macaddr MAC адрес. inetaddr IPv4 адрес. inetnet IPv4 адрес/длина маски. date Дата в формате YYYY-MM-DD [Список] Задает допустимый набор символов. Можно использовать ^ и - при- вычным образом. =Строка Параметром может быть только в точности заданная строка. Понимаются следующие флаги: -a Если найденный параметр пуст, то ищем дальше непустой. -A Выдает свой список аргументов в формате COPY PostgreSQL. В основном нужен как пример и для отладки соответствующей библиотечной функции. -c Text Строка, которая выводится на stderr при ошибке. Эта строка выводится только если код возврата отличается от 0. -f File Файл, которая выводится на stderr при ошибке. Этот файл выводится только если код возврата отличается от 0. Если заданы и -c и -f то выводится только строка по -c -e File Файл, в котором содержатся варианты сообщений по ошибке для выдачи на stderr, если не заданы флаги -c -f. Сообщение об ошибке ищется в этом файле только если код возврата отличается от 0. Формат этого файла таков: PATTERN PATTERN ... TEXT TEXT ... PATTERN ... где PATTERN начинается с первой позиции строки, а текст имеет в пер- вой позиции пробел или табуляцию, которые при выводе опускаются. При возникновении ошибки, о которой сообщает код возврата, среди PATTERN ищется соответствующая флагам -x[x...][n имя_параметра] и образец в которой соответствует тип и имя_параметра в вызове; и выводится блок текста после найденной PATTERN. При выводе первая позиция в строке удаляется. После вывода одного блока текста даль- нейший поиск не производится и программа прекращает работу. Символы "конец строки" и "возврат каретки" из этого файла при выводе не уда- ляются независимо от флагов -n -r. PATTERN может начинаться со знака минус, за которым следует некото- рое количество знаков x флагов, за корорыми могут следовать пробелы, за которыми следует знаки образца вплоть до конца строки. Если знак минус в первой позиции отсутствует, то в такой PATTERN флаги отсут- ствуют и все символы соответствующей строки являются образцом. PATTERN сравнивается с параметрами следующим образом: Сначала прове- ряется количество флагов -x в PATTERN - оно должно быть меньше или равно количеству флагов -x в вызове программы. Если в PATTERN или в вызове этих флагов больше 3, то их количество приравнивается к 3, если в вызове или в PATTERN эти флаги отсутствуют, то их количество приравнивается к 0. Если по количеству флагов -x PATTERN совместима с вызовом, то аргумент вызова тип сравнивается с образцом. Они должны совпадать либо полностью, либо, если образец оканчивается на знак *, то до этого знака. -E Выдает свой список переменных из environment в формате COPY PostgreSQL. -h Краткая подсказка -H Хак, используется для ввода параметра с незакодированными пробелами в нем. -i Выдает для всех запущенных в системе процессов три колонки в формате COPY PostgreSQL: номер процесса, номер параметра, текст параметра. -n Удалять символы LF -N При выдаче в формате COPY PostgreSQL добавляется колонка с номером. -p Ввод из stdin вместо переменных окружения. -P Выдает свой список параметров http запроса в формате COPY PostgreSQL. -q Quoting[/Quoting]... Quote output string. Возможные на момент написания значения Quot- ing: psql Аналогично quote_literal from PostgreSQL, но всегда без внеш- них кавычек. psqi Аналогично quote_ident from PostgreSQL, но всегда без внешних кавычек. sq Поставить одинарные кавычки вокруг параметра. dq Поставить двойные кавычки вокруг параметра. -r Удалять символы CR -t Не выводить результат, только проверка. -w Text Если в строке QUERY_STRING до декодирования есть символы &, то такую строку целиком можно получить только используя этот флаг. Он задает строку-разделитель параметров, которая вставляется вместо & при декодировании QUERY_STRING. -x Если среди параметров не найден заданный, то выход с ошибкой, по умолчанию getCGIparm если не находит заданного параметра, то не выводит ничего и оканчивается без ошибки. -xx Если найденный параметр не соответствует образцу, то выход с ошиб- кой. По умолчанию при несоответствии найденного параметра образцу код ошибки при возврате не устанавливается. Если параметр не соот- ветствует заданному образцу, то выводится только пустая строка. -xxx Если найденный параметр имеет нулевую длинну, то выход с ошибкой. По умолчанию при пустом параметре не устанавливется ошибка в коде возврата. -z Text If not error (see -x) and output string is empty then substitute it for Text. ENVIRONMENT QUERY_STRING SERVER_PROTOCOL используется вместе с -H. EXAMPLES Вот эта строка в CGI на sh вводит значение параметра param в переменную var, если он является более-менее правильной датой, и сообщает об ошибке и прекращает обработку, если синтаксис был нарушен или если в качестве даты вообще не было ничего введено: if ! var=`getCGIparm -xxx date param` then echo '!Еrror!' exit 1 fi Если в форме используются альтернативные способы ввода, как в этом при- мере:
В этой форме есть два поля ввода с одним именем. Следующий вызов полу- чает параметр из первого непустого из полей с именем "index" если такое есть: var=`getCGIparm -axx [0-9] index` Без -a в этом вызове исследуется только первый параметр с именем "index". Для использования сообщений об ошибках от самой getCGIparm ее надо вызы- вать примерно так: if! var=`getCGIparm -xxx -e ErrSelFile [0-9] index` 2>&1; then exit 1; fi Если в этом примере не сделать перенаправления, то сообщение об ошибке попадет в log файл сервера. Использовать в этом примере флаги -c или -f несложно - строка или файл просто копируются в качестве сообщения об ошибке. Пример файла с несколькими сообщениями об ошибках к примерам выше: -xxx [0-9] Не введен или неправильно введен обязательный параметр. В этом параметре допустимы только цифры -xx [0-9] Неправильно введен параметр. В этом параметре допустимы только цифры -xxxn parm date Не введена или неправильно введена дата. Допустимый формат даты: YYYY-MM-DD * Неизвестная ошибка ввода В следующем примере любой текст, в том числе и с опасными символами, пра- вильно вводится в поле комментария СУБД PostgreSQL, так как параметр сна- чала обрабатывается так, что бы в нем опасные символы были экранированы по правилам PostgreSQL, (psql) а затем результат берется в кавычки (sq): UPDATE table SET comment=`getCGIparm -q psql/sq any` WHERE ... SEE ALSO getCGIparmpass1(3), getCGIparmpass2(3), getCGIparmpass3(3), getCGIparmpass4(3), getCGIparmarray(3), getCGIparmenv(3), getCGIparmcopy(3), getCGIparmproc(3), sysexits(3) AUTHOR Aleksandr A. Babaylov (aka @BABOLO) .@babolo.ru http://www.babolo.ru/ BUGS Документация ни к черту. Состав типов, которые можно задавать аргументов тип фиксирован и не может быть изменен иначе, как трансляцией. Тип date не вычисляет в точности дату, ему можно задать 31 число в любом месяце. Диапазон дат ограничен с 1900 по 2147 год. Все фильтры (-q) являются частью программы и их состав не может быть изменен иначе, как трансляцией. 09 September 2001