Персональные CGI - Ваши скрипты на Perl и других языках
| |
|
Разрешено выполнять CGI-скрипты без предварительной
верификации нашим техническим персоналом. Вы сами можете писать скрипты и
выкладывать их на наш сервер по протоколу ftp.
cgi могут быть в виде скриптов на perl5 или выполняемых программ
для архитектуры i386 и операционной системы FreeBSD.
Учтите, что скрипт работает под Вашими правами, поэтому неправильно
написанный cgi-скрипт может привести к уничтожению или замене содержимого
Вашего сервера. Ваша ошибка не приведет к сбою в работе нашего компьютера,
но Вы можете получить ощутимый моральный ущерб при искажении информации
на Вашем сервере. Мы не несем никакой ответственности за ошибки
в написанных Вами cgi-скриптах.
Мы даем выполнять cgi скрипты без предварительной верификации.
Однако мы выдвигаем требование, чтобы программы работали правильно
и не пытались занять все ресурсы машины.
Мы предпринимаем ряд мер,
обеспечивающих стабильность компьютера, на котором размещены
виртуальные сервера. Каждая запущенная задача имеет ограничения
по процессорному времени и по памяти. Так же существует
ограничение по количеству задач запущенных одним пользователем.
Мы постоянно контролируем эти ограничения. По мере необходимости
мы увеличиваем мощность базового компьютера и расширяем лимиты.
Адекватно работающие скрипты, правильно написанные и соблюдающию
идеологию WWW, не испытывают никаких проблем, и никогда не достигают
установленных ограничений.
В соответствии с идеологией WWW, cgi скрипты не должны делать
активных вычислений и прочей трудоемкой работы во время выдачи
ответа конечному пользователю. Постарайтесь, чтобы скрипты отрабатывались
быстро. Всю сложную работу лучше выполнять отдельно, запуская из shell
различного рода обработчики и индексаторы. В противном случае
нетерпеливый клиент может в десятки раз увеличить загрузку
машины быстро нажимая "reload".
Будьте бдительны, не допускайте явных ошибок. Тщательно
верифицируйте получаемые данные. Учтите, что хакер постарается ввести
не те данные, которые вы ждете, а те, которые ему могут помочь получить
доступ к Вашему серверу. Никогда не используйте полученные
данные как имя файла или каталога. Проверяйте конструкции типа
[file="../../../index.html"]
Скрипты должны лежать в подкаталоге vcgi в вашей домашней директории.
Права на скрипт должны быть rwxr-x--- (750), т.е. это исполняемый
файл, доступный на запись только для его владельца.
Если Вы создаете поддиректории, то у них должны быть аналогичные права.
Скрипты с неправильными правами или лежащие в директориях с неправильными
правами, работать не будут.
Обращаться к своим скриптам нужно по схеме
/cgi-bin/your-cgi.pl
В ряде скриптов необходимо указывать директорию в которой лежат
рабочие файлы. Указывайте пути относительно vcgi директории. Именно она
является текущей при выполнении скрипта.
Пример:
#D1E5FCasedir="../data";
Русский язык, кодировка
Расширение скрипта должно быть .pl. В этом случае перекодирующий
сервер правильно выдаст charset.
Для неперекодирующего сервера нужно самостоятельно поставить
charset: windows-1251
Образец скрипта:
#!/usr/local/bin/perl
print "Content-type: text/html";
if ( (!($ENV{"SERVER_SOFTWARE"} =~ /rus/))) {
print ";charset=windows-1251";
}
print "\n\n";
print "<HTML>";
while (($key,$val) = each %ENV) {
print "$key = $val<br>";
}
Сохраните этот текст в файл, положите в свою cgi директорию, поставьте
правильные права ( chmod 750 file), и попробуйте его в работе.
Где лежит perl?
#!/usr/local/bin/perl - perl5
в директории /usr/local/perl/lib лежат модули для perl5.
Как правильно загружать скрипты на сервер?
Скрипты на языке Perl представляют из себя текстовые файлы. Если для
загрузки скриптов Вы пользуетесь FTP-клиентом, необходимо контролировать
режим, в котором на сервер загружаются такие данные. Текстовые файлы нужно
загружать в текстовом (ASCII) режиме. Еще бывает двоичный (BINARY) режим
работы FTP. Скрипты, загруженные в двоичном режиме, работать не будут.
Где находится sendmail и как правильно его вызывать?
/usr/sbin/sendmail
Обратите внимание на то, что вызов sendmail для отправки почты из скриптов
нужно производить с параметром -f и далее указывать отправителя, а если
нужно и получателя сообщения. Это позволит почтовым серверам правильно
обрабатывать сообщения об ошибках, которые могут возникнуть при доставке
созданного скриптом письма.
По стандарту поле
Return-path в каждом почтовом сообщении помогает почтовым серверам
определять, кто-же на самом деле является отправителем сообщения.
Уведомления об ошибках отправляются именно на адрес, указанный в поле Return-path. Опция
-f позволяет явно указать что за адрес в результате окажется в заголовке
созданного письма в поле Return-path. Поле From Вы как обычно создаете прямо
в скрипте.
Пример программы на языке perl :
#!/usr/local/bin/perl
open MAIL,"|/usr/sbin/sendmail -f devnull\@aha.ru -t" || die "Cannot open sendmail - $|";
print MAIL "From: test\@aha.ru\nTo: devnull\@aha.ru\nSubject: test\n\nThis is a body";
close MAIL;
Отладка CGI скриптов
Зайдите в unix shell. Сделайте shell скрипт примерно такого содержания:
#!/bin/sh
QUERY_STRING="все что бывает после ?"; export QUERY_STRING
PATH_INFO="все что бывает после /"; export PATH_INFO
HTTP_USER_AGENT="Mozilla"; export HTTP_USER_AGENT
#any other vars used in script ; export it
cd vcgi
/usr/local/bin/perl -d your.script.pl < ~/file_with_POST_data
-d запускает perl debugger. Если он не нужен, уберите этот ключ.
Если Вам не нужно проверять POST, то < ~/file_with_POST_data можно
опустить.
Вообще, старайтесь проверять скрипты перед тем, как помещать на веб-сервер.
Если в скрипте есть ошибки, то, запустив скрипт в unix shell, Вы сможете
увидеть что конкретно "не нравится" интерпретатору perl. Если скрипт
работает в shell, но не работает при запуске через web, выдавая 'internal
server error 500', посмотрите в файл error_log, который есть в Вашем
домашнем каталоге. Стоит отметить, что файл этот будет появляться только в том
случае, если Вы включили соответствующую опцию на сервере
статистики. Web-сервер пишет в error_log сообщения об ошибках, которые возникают при
его работе.
Если Вам нужен cgi script на perl, то не старайтесь сразу написать его,
лучше сходите на
CPAN
Полезные ссылки
Perl FAQ by Sly Golovanov