Жемчужина PERL: мощь C++ и простота Basic

Автор: Topol Суббота, Август 11th, 2012 Нет комментариев

Рубрика: Perl

Введение

Язык Перл был создан в 1986 году как инструмент для администрирования и конфигурирования системных ресурсов в сети, состоящей из Unix-компьютеров. Постепенно Перл (аббревиатура расшифровывается как «язык для практического извлечения текстов и генерации отчетов» — Practical Extraction and Reporting Language, или же — нежно и ласково — как «язык для патологически эклектичных распечаток чепухи» — Pathologically Eclectic Rubbish Listing) эволюционировал в межплатформенный язык и оказался в центре внимания процветающего кибернетического сообщества. (Вы можете спросить, почему «Perl», а не «Pearl», то есть «жемчужина»? Это получилось потому, что графический язык с именем Pearl к моменту создания Перл уже существовал. Правда, полная аббревиатура словосочетания Practical Extraction and Reporting Language звучит именно как Pearl.)

Потрясающее число людей посвятило впечатляющее количество свободного времени работе с Перл, его совершенствованию и повсеместному распространению. Например, когда вы заглядываете в мир Интернет, Перл буквально повсюду.

Перл является интерпретируемым языком (хотя Перл-компиляторы тоже существуют), который предназначен для сканирования текстовых файлов, извлечения из них информации и вывода на основе полученных таким образом данных текстовых отчетов. При этом он замечательно стыкуется с базами данных и серверами, работающим по технологии Windows OLE Automation, с другими процессами и т. д.

Некоторые удивляются популярности Перла, языка, ориентированного на текстовый ввод и вывод, запускаемого из командной строки, в мире графических интерфейсов типа Windows.

Популярность Перла продолжает расти по ряду причин:

  • Многие операционные системы, имея развитые графические оболочки, остаются текстово-ориентированными.
  • Перл является межплатформенным языком, максимально идентично поддерживаемым в разных операционных системах, отличаясь только в нескольких неизбежных деталях (таких, как число байтов, используемых для представления длинного целого).
  • На самом деле Перл обладает определенными графическими возможностями за счет взаимодействия с популярным модулем Tk.pm. Этот модуль позволяет использовать стандартные графические интерфейсные элементы (widgets — виджеты) с помощью вспомогательного средства — библиотеки Tk языка Tcl. Посредством Перла можно отображать окна с кнопками, меню и другие объекты.
  • Однако, с точки зрения явного большинства программистов, текущая популярность Перла подпитывается возможностью программирования в среде шлюза Common Gateway Interface (CGI-программированием), применяемого для операций по взаимодействию клиент/сервер в среде Web. Когда речь идет о создании web-страниц, текстовая ориентированность языка перестает быть недостатком, так как они тоже являются чисто текстовыми объектами. CGI-программирование на Перле представляет собой очень мощный инструмент.

Версия 5 стала блестящей реализацией возможностей языка Перл, позволяющей применять множество дополнительных новейших технологий программирования — это и блоки BEGIN и END для пакетов, и совместимость с операционными системами класса POSIX, и объектно-ориентированное программирование, произвольно вложенные структуры данных, лексические области видимости, расширенные возможности по использованию модулей, а также многое другое. Все примеры, приведенные далее, используют интерпретатор языка Перл версии 5.005.

Интернет-ресурсы и справочная информация о Перле

К интерпретатору Перла прилагается обширная и полезная документация. В системах типа Windows эта документация представляется в виде гипертекстовых HTML-страниц. Для многопользовательских систем вы, как правило, получаете доступ к этой документации с помощью системных команд (подобно команде man операционной системы Unix).

Для программистов на Перле имеется также ряд сетевых конференций (групп новостей Usenet):

  • comp.lang.perl.announce — группа с низким потоком сообщений;
  • comp.lang.perl.misc — группа с интенсивным потоком сообщений (сюда, в частности, рассылается FAQ-файл по Перлу);
  • comp.lang.perl.modules — все имеющее отношение к созданию модулей и многократно используемого кода;
  • comp.lang.perl.tk — о связи между Перлом и оконно-графической библиотекой Tk интерпретатора языка Tcl. Библиотека Tk поддерживает большое количество визуальных интерфейсных элементов (кнопки, меню и т. д.). Вы можете использовать их в языке Перл, и такое использование становится довольно популярным;
  • comp.infosystems.www.authoring.cgi — эта группа не содержит шаблона perl в своем имени, однако это хорошее место для обсуждения с другими разработчиками особенностей CGI-программирования на Перле.

В Сети имеются также многочисленные web-страницы, посвященные Перлу (случайный поиск по Всемирной Паутине возвращает более 1 527 903 страниц, на которых упоминается Перл):

  • Домашняя страница Перла — www.perl.com. Здесь вы сможете найти исходный код интерпретатора Перла и готовые программы под различные операционные системы, документацию, модули, сообщения об ошибках, а также FAQ — список ответов на часто задаваемые вопросы (он находится на www.perl.com/perl/faq).
  • Чтобы скачать сам Перл, его модули, расширения и тонны других имеющих отношение к нему вещей, загляните в архив CPAN (Comprehensive Perl Archive Network) на www.cpan.org или www.perl.com/CPAN-local/CPEN.html. Это — огромный, объединяющий воедино несколько сайтов источник почти всего, что имеет отношение к Перлу. Если вы прогуляетесь по архиву CPAN, то, безусловно, найдете там нужный вам код. Все — от расширений языка Перл до обработки изображений, от модулей для работы в Интернете до интерфейсов к базам данных.
  • Институт Перла на www.perl.com — это некоммерческая организация, чьей целью является, по ее собственным словам, «поддержка Перла доступным, работоспособным и бесплатным для всех». Институт, собрав под своим крылом цвет содружества любителей Перла, обеспечивает серьезную поддержку обмена информацией между программистами на Перле.
  • Страница, посвященная самому языку Перл, находится на www.perl.com/perl (сюда же вас приведет ссылка language.perl.com). Здесь находятся обзоры, новости, списки ресурсов, программное обеспечение. Здесь же расположен каталог списков рассылки (mailing lists), посвященных языку Перл.
  • Многие сайты, специализирующиеся на таких вопросах, как обеспечение секретности, CGI-программирование и т. д., содержат разделы, относящиеся к Перлу, — если не боитесь утонуть в потоке подобной информации, просто проведите web-поиск.
  • Также четыре раза в год издается печатный (бумажный) вариант журнала по языку Перл. Больше узнать о нем можно на страничке orwant.www.media.mit.edu/the_perl_journal.

 

Как скопировать и установить Перл

Перл является свободно распространяемым программным продуктом. Все, что вам надо сделать, — это загрузить его из Интернета и установить на своем компьютере. Если вы работаете в многопользовательской системе, в ней уже может быть установлен Перл. Чтобы проверить это, попробуйте выполнить команду perl -v, которая выдаст на экран версию вашего Перл-интерпретатора.

Вам также потребуется инструмент для создания Перл-сценариев (это просто текстовые файлы, обычно с расширением *.pl, содержащие команды и описания языка Перл). Чтобы создать сценарий для Перла, вам нужен текстовый редактор, который сохраняет редактируемые файлы в формате простого текста. Вам не потребуется глубокое знание операционной системы Unix, для которой изначально создавался этот язык. Перл далеко вышел за рамки операционной системы Unix, и настало время, чтобы руководства по языку Перл признали этот факт.

Если Перл не установлен на вашем компьютере, вы можете найти его на www.perl.com или www.cpan.org (CPAN — Coprehensice Perl Archive Network — самый полный электронный архив материалов, имеющих отношение к языку Перл). На этих сайтах вы можете найти и загрузить все что вам нужно.

Не имеет особого смысла описывать процессы инсталляции, которые нужно выполнить для разных операционных систем, чтобы установить Перл. Во-первых, эти процедуры тщательно детализированы и описаны на указанных сайтах (например, руководство по инсталляции Перла для Unix на www.perl.com/CPAN-local/doc/relinfo/INSTALL.html). Во-вторых, они подвержены спонтанным изменениям.

Самая последняя версия Перла может быть получена, если выбрать ссылку «Get the latest version of Perl» на сайте www.perl.com. Эта ссылка приведет вас к страничке, на которой перечислены версии Перла для наиболее популярных операционных систем (например, ActiveState Perl для Win32). Убедитесь, что вы получили версию 5.005 или более позднюю, поскольку более ранние версии Перла для Win32 не вполне совместимы с Перлом для Unix и его модулями.

Как написать сценарий для Перла

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

Команды встречаются в двух формах: простой и составной. Простая команда — это выражение, которое выполняет некоторое конкретное действие. В программе простые команды заканчиваются точкой с запятой (;), как это происходит в следующем примере, где функция print используется для вывода на экран строки Hello!, завершаемой символом перевода строки n:

<i> print "Hello!n"; </i>

Составные команды состоят из выражений и блоков. Блоки в языке Перл ограничиваются фигурными скобками { и } и могут содержать несколько простых команд. Они также имеют свои области видимости (область видимости элементов типа переменных — это сегмент программы, в котором можно использовать эту переменную). После закрывающей фигурной скобки не надо ставить точку с запятой (пример простого цикла):

<i> for ($loop_index = 1; $loop_index <= 5; $loop_index++) { print "Hello!"; } </i>

Для вывода текста можно использовать функцию print, но как же ввести текст? Вы можете читать из стандартного входного потока STDIN, используя угловые скобки < >. В следующем примере мы используем цикл while, чтобы считывать строчка за строчкой вводимый пользователем текст, запоминать его в переменной $temp и затем печатать на экране дисплея:

<i> while ($temp = <STDIN>) { print $temp; } </i>

Если вы запустите этот сценарий и введете с клавиатуры слово «Hello», сценарий повторит это слово на экране:

<i> Hello! Hello! </i>

При создании сложных сценариев нужно добавлять комментарии, своеобразные напоминания самому себе, что именно делается данным кодом. Это делает структуру сценария более прозрачной и облегчает работу с ним. При этом самим Перлом комментарии игнорируются. Комментарии Перла начинаются с символа #. Перл игнорирует весь текст, идущий после символа # до конца строки.

Истинный тест, естественно, будет в том, сможет ли Перл прочитать и проинтерпретировать ваш сценарий.

Выполнение сценариев Перла

Предположим, что имеется файл hello.pl со следующим сценарием на Перле:

<i> #!/usr /local /bin /perl5 -w (без пробелов)       # Use Perl5 with warnings print "hellon"; </i>

Cуществует два основных способа выполнения Перл-сценариев. Во-первых, вы можете выполнить его, запустив интерпретатор Перла в явном виде из командной строки:

<i> %perl hello.pl </i>

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

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

<i> %hello.pl </i>

 

Как ваш сценарий сам может найти Перл

Если ваш сценарий может запустить интерпретатор Перла самостоятельно, вам легко его выполнить. Для Unix’а это значит, что в качестве первой строчки присутствует текст типа #!/usr /local /perl5 -w (без пробелов). Кроме того, сценарий надо сделать выполняемым файлом. Это осуществляется с помощью команды

<i> chmod +x hello.pl </i>

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

<i> %hello.pl </i>

В операционных системах Windows или Macintosh, чтобы запустить сценарий, нужно дважды щелкнуть по его имени. Убедитесь, что в случае Windows файл имеет расширение .pl, поскольку пакет ActiveState Perl использует именно это расширение для ассоциирования файлов скриптов с интерпретатором Перла.

Если вы работаете в операционной системе MS DOS, то, преобразовав с помощью утилиты pl2bat.bat пакета ActiveState Perl Перл-сценарий к форме командного, просто запустите этот файл из командной строки:

<i> C:>hello.bat </i>

 

CGI-программирование

CGI-программирование (Common Gateway Interface) — очень популярное среди программистов применение языка Перл (и, по мнению некоторых, единственная причина существования этого языка). CGI-программирование основывается на CGI-сценариях, которые, с точки зрения языка, являются обычными программами на Перле, но с расширением .cgi. Вы инсталлируете сценарии у вашего провайдера, и это позволяет оживлять ваши web-страницы кнопками, прокручивающимися списками, всплывающими меню и многими другими элементами управления. С помощью CGI пользователь может взаимодействовать с вашими web-страницами, получая доступ к базам данных, запуская программы, играя в игры и даже оформляя через них заказы. Для сотен тысяч программистов Перл — обратная сторона интерактивных web-страниц.

Предполагается, что у вас есть провайдер, предоставляющий доступ в Интернет, свой раздел на сервере, а также возможность размещать на нем свои собственные страницы. (Обычно вы можете делать это либо с помощью программы, использующей протокол FTP, либо с помощью специальной страницы на сервере вашего провайдера, предоставляющей вам возможность закачивать файлы.) Также вам будет необходимо разрешение провайдера на запуск CGI-сценариев (дело в том, что иногда с целью защиты информации такая возможность запрещается). Предполагая, что не только вы можете запускать CGI-сценарии, не забывайте также устанавливать соответствующие права доступа для этих файлов — помните о защите своих файлов и системы в целом. Для получения более полной информации о процессе размещения ваших страниц имеет смысл обратиться к вашему провайдеру.

В последнее время распространяется и другой удобный шлюз — PHP, использование которого позволяет включать целые блоки и программы на языке Перл прямо в текст HTML-страниц пользователя, что решает множество проблем защиты и разделения доступа для ISP, но детальное рассмотрение этой новинки выходит за рамки данной статьи.

Использование CGI.pm

Итак, как вы создаете CGI-сценарий? Теоретически это очень просто: ваша CGI-программа, как и любая другая программа на Перле, выполняет обычные команды Перла, когда она вызвается броузером (то есть когда броузеру в качестве URL задан ваш CGI-сценарий). Все, что вы направляете в стандартный вывод, передается броузеру. Так, если ваш CGI-сценарий выполняет команду, например print «Hello!», этот текст будет возвращен броузеру и на странице появится надпись «Hello!». Но это архаичный способ. Что делать, если вам понадобится прочитать то, что пользователь ввел при помощи элементов управления, расположенных на вашей странице? Или если вы захотите создать эти элементы управления из вашего сценария? Эти и не только эти проблемы решаются с использованием прилагающегося к Перлу пакета CGI.pm.

Итак, интерпретатор Перла содержит, среди других модулей, стандартный модуль CGI.pm. Поэтому, если в вашей системе установлен Перл, то вы должны иметь файл CGI.pm. Начиная с пятой версии Перла, CGI.pm стал объектно-ориентированным, хотя упрощенный функционально-ориентированный интерфейс все еще существует. Создавая с помощью CGI.pm объекты CGI, можно затем вызывать различные методы этого объекта. Существуют методы, соответствующие практически всем основным тегам HTML, и при их вызове создается нужный тег HTML с указанными атрибутами. Все они могут получать именованные параметры (за исключением методов, требующих лишь один аргумент). Это означает, что вы указываете не только значение атрибута HTML, но и его имя. Вот пример, в котором используется объект CGI для создания web-страницы с помощью методов этого объекта для создания тeгов HTML:

<i> #!/usr /local /bin /perl  (без пробелов) use CGI; $co = new CGI; print $co->header, $co->start_html(-title=>'CGI Example'), $co->center($co->hl('Welcome to CGI!')), $co->textarea( -name => 'textarea', -default => 'No opinion', -rows => 10, -columns => 60 ), $co->end_html; </i>

Если вам не нужны возможности объектно-ориентированного интерфейса, пакет CGI.pm также поддерживает простой функционально-ориентированный интерфейс. Вот пример, который использует функционально-ориентированный интерфейс — он выводит текстовое поле с предложением пользователю ввести его. Когда пользователь следует этому предложению и нажимает кнопку Submit, данные этого поля посылаются обратно тому же CGI-сценарию, который использует метод param для того, чтобы вывести введенное пользователем имя в нижней части web-страницы:

<i> #!/usr /local /bin /perl (без пробелов) use CGI qw/:standart/; print header, start_html('CGI Functions Example'), h1('CGI Functions Example'), start_form, "Please enter your name: ",textfield('text'),p, submit,reset, end_form, hr; if(param()) { print "Your name is: ", em(param('text')), hr; } print end_html; </i>

Есть еще один пакет, который приобрел большую популярность среди программистов, — cgi-lib.pl (cgi-lib.stanford.edu/cgi-lib). Очень многие CGI-сценарии на Перле написаны с его использованием. Вам нет нужды знать технику установки — вы просто берете копию cgi-lib.pl, сохраняете ее в том же каталоге, что и CGI-сценарии, и с помощью команды require подключаете ее к своим сценариям:

<i> require 'cgi-lib.pl'; </i>

 

Почти все, что вам нужно, уже написано

С помощью CGI-сценариев на языке Перл можно писать самые разные интерактивные web-интерфейсы: счетчики посещения, гостевые книги, системы отправки электронной почты (например, автоматическое подтверждение принятого заказа), комнаты для бесед (chat rooms), теневые посылки (cookies), интерактивные игры, системы обслуживания заказов (заполнение форм) в электронных магазинах, системы анкетирования и голосования и т. д.

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

  • архив Ясона (Jason’s Perl Archive) — www.aquapal.co.uk/perl/perl.html;
  • архив сценариев Мэтта (Matt’s Script Archive) — www.worldwidemart.com/scripts;
  • архив фирмы Yahooo! (Yahoo Perl Scripts) — dir.yahoo.com/Computers_And_Internet/ProgrammingLanguages
    /Perl/Scripts;
  • страница ссылок и сценариев на Перле, принадлежащая Дэйлу Бьюли (Dale Bewley’s Perl Scripts and Links) — www.bewley.net/perl;
  • страничка на www.perl.com, посвященная CGI — reference.perl.com/query.cgi?cgi;
  • архив сценариев www.script.ru.

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

Защита CGI

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

Для этой цели на UNIX-системах CGI-сценарии запускаются в том числе и под идентификатором пользователя, соответствующим «nobody» (никому). Это означает, что запущенный процесс имеет немного привилегий. Делалось это исходя из того, что, имея меньшие привилегии, процесс принесет меньше вреда. Однако и по сей день могут возникать проблемы — в частности, из-за неаккуратности в CGI-сценариях. Можно показать, как обойти некоторые наиболее вероятные неприятности.

Вот несколько web-страниц, посвященных защите CGI в языке Перл, которые весьма полезно почитать перед тем, как вы начнете создавать для широкого использования что-либо серьезнее простейших CGI-сценариев:

  • страница консорциума WWW, посвященная защите CGI (The World Wide Web Consortium’s CGI security page) — www.w3.org/Security/Faq/www-security-faq.html;
  • часть сборника вопросов и ответов (FAQ) по CGI-программированию на Перле, посвященная проблемам защиты, — www.perl.com/CPAN-local/doc/FAQs/cgi/perl-cgi-faq.html;
  • страничка Селены Сол (Selena Sol), посвященная риску при установке сценариев, написанных не вами, — Stars.com/Authoring/Scripting/Sequrity;
  • вопросы и ответы (FAQ) Поля Филипса (Paul Philips) — www.go2net.com/people/paulp/cgi-sequrity/safe-cgi.txt (имейте в виду, что хотя эта страница и имеет хороший набор ссылок, она не обновлялась с 1995 года).

CGI-сценарии могут иметь множество потенциальных дыр в защите. В качестве предельного случая рассмотрим сценарий, который сам запускает программы, имена которых вы передаете в качестве аргумента: http://www.yourserver.com/user/perl.exe?script.pl.

Если хакер увидит, что вы используете незащищенную технику вроде этой, ему будет очень просто послать собственную строку аргументов. Это позволяет хакеру выполнять на вашем сервере все команды Перла, какие заблагорассудится, что вряд ли вас порадует. Этот пример указывает на одну из самых больших дыр в CGI-сценариях, написанных на Перле, — вызовы внешних программ без проверки кода, передаваемого последним.

В Перле вы можете вызывать внешние программы многими способами. Например, с помощью строки, заключенной в обратные апострофы (backtics), можно открыть транспортер, или канал пересылки данных (pipe), к другой программе и использовать вызовы system или exec. Даже операторы eval требуют осторожного с собой обращения. Очень важно, чтобы вы настроили свой CGI так, чтобы нельзя было легко сделать ничего опасного. Хакеры собаку съели на использовании этого класса дырок в защите и на применении ваших же CGI-сценариев для того, чтобы последние выполняли нужный хакеру код.

На самом деле, в Перле существует полный защитный механизм, предназначенный для управления этим типом дырок. Когда вы разрешаете отслеживание данных, Перл не позволяет вам передавать данные, пришедшие со стороны, функциям system, exec и им подобным. Это так называемый механизм помеченных данных (tainted data).

Простое правило, позволяющее заткнуть дыры в защите, — никогда не передавать непроверенные данные внешней программе и всегда стараться найти пути, которые позволят вам обойтись без запуска командной оболочки. Когда же, в очень редких случаях, вам не избежать работы с командным интерпретатором, следует всегда проверять аргументы, передаваемые вами, на предмет наличия в них метасимволов командной оболочки и, по крайней мере, их удаления. Вот метасимволы командной оболочки UNIX shell:

<i> &;""*?`<>^(){}$nr </i>

Еще одно важное замечание: не позволяйте другим перезаписывать ваши сценарии или файлы данных, неважно — случайно или намеренно. Другими словами, будьте особенно внимательны к тому, как вы устанавливаете права доступа к файлам, с тем, чтобы они не могли быть замещены новыми.

И, конечно же, обычные ограничения по секретности: не посылайте пароли по электронной почте, не набирайте их при использовании широко доступных утилит вроде ytalk операционной системы Unix. Не оставляйте ваш допуск к системе (account) на долгое время неиспользуемым — хакеры следят за такими каналами доступа с тем, чтобы получить контроль над ними. Не позволяйте вашим CGI-сценариям получать слишком много системной информации. И так далее, и тому подобное — большинство хакеров пролезут там, где вы и не думали.

Источник:  internet-technologies.ru

Оставить комментарий

Чтобы оставлять комментарии Вы должны быть авторизованы.

Похожие посты