Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

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


Здравствуйте, уважаемые подписчики!

Сегодня в выпуске:

  • Работа с файлами в CGI-скриптах на Perl. Продолжение

  • Несколько слов о форуме

Тем, кто подписались недавно, настоятельно рекомендую получить прошлые выпуски нашей рассылки в архиве рассылки. Он находится здесь

Также напоминаю, что сайтом нашей рассылки является сайт "CGI Scripts Info: все о CGI-скриптах" где Вы сможете найти статьи по веб-программированию, а также коллекцию "готовых" CGI-скриптов для своего сайта и форум по веб-программированию.

Работа с файлами в CGI-скриптах на Perl

Часть 2. Права доступа к файлам в UNIX

Поскольку в настоящее время подавляющее большинство веб-серверов работает под управлением ОС UNIX или ее многочисленных клонов (Solaris, Linux, FreeBSD и т.п.), то разработчикам скриптов (а также веб-мастерам, устанавливающим у себя на сайтах готовые CGI-скрипты) необходимо знать некоторые особенности этих ОС. В первую очередь это касается атрибутов прав доступа на файлы и каталоги. Эту тему мы рассмотрим перед темой ошибок открытия файлов, т.к. возможной причиной ошибок такого рода может быть именно неверная установка прав доступа к тем или иным файлам.

Как я упоминал в прошлом выпуске, UNIX-подобные ОС являются сетевыми многопользовательскими ОС и имеют развитую систему так называемой "локальной защиты" файлов, т.е. системой регулирования доступа к файлам на уровне файловой системы. Эта система позволяет оградить файлы одних пользователей от любопытства и/или злого умысла других, а также защитить файлы операционной системы от недобрых или неопытных действий пользователей.

Для начала определимся с понятием "пользователь". В UNIX это понятие относится не только и не столько к человеку, работающему за компьютером, сколько к исполняющимся на этом компьютере (сервере) программам, точнее, процессам. Например, существует понятие "псевдопользователь" - это учетная запись в системе, специально созданная для работы "под ней" определенных служб, роботов и т.п. Любой процесс, исполняющийся в системе, работает "от имени" того или иного пользователя (или администратора) и обладает его правами. "Бесхозных" процессов в UNIX нет.

Каждый пользователь и группа, кроме имени, имеет еще и числовой идентификатор - UserID (UID) и GroupID (GID). Собственно говоря, UID и GID и есть те самые "внутренние" параметры, которыми оперируют операционная система и программы (ведь машинному коду значительно проще работать с двухбайтным числом, чем со строкой символов), при необходимости "переводя" для читабельности в строки. В Perl-скриптах тоже чаще приходится работать с ID, чем с именами (хотя, вообще, в CGI-скриптах работа с этой информацией используется крайне редко).

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

Основные атрибуты доступа включают в себя три однотипные группы по три следующих флажка - r (чтение), w (запись) и x (исполнение). Первая группа определяет права доступа к файлу его владельца, вторая - группы, в которую входит владелец, и третья - всех остальных пользователей.

Права доступа могут записываться в буквенном или числовом виде. Первый вариант наиболее простой и выглядит, например, следующим образом: rwxr-xr-x (сброшенные атрибуты доступа изображаются в виде черточки). В этом примере владелец файла имеет доступ к нему на чтение, запись и исполнение (rwx), а группа владельца - только на чтение и исполнение (r-x), но не на запись. Такие права доступа рекомендует большинство хостинг-провайдеров для исполняемых файлов CGI-скриптов (хотя есть и исключения - всегда руководствуйтесь рекомендациями Вашего конкретного хостинга).

В числовом виде права доступа записываются в виде трех цифр, также соответствующих владельцу файла, группе владельца файла и остальным пользователям. Каждая цифра представляет собой отображение "двоичного" выражения тех самых флажков rwx, где 1 соответствует установленному флажку, а 0-снятому. Или, проще говоря, числовое выражение атрибутов доступа можно определить по формуле 4*r+2*w+1*x. Таким образом, 'rwx' можно представить цифрой 7 (4+2+1), 'r-x' - цифрой 5. Таким образом, числовое выражение прав доступа rwxr-xr-x будет 755, а rw-r--r-- - 644.

Несколько слов о правах доступа на каталоги (папки). Атрибуты прав доступа к каталогам имеют почти такой же состав и структуру, и их смысл во многом похож на смысл атрибутов доступа к файлам:

r - чтение содержимого каталога
w - запись (изменение) каталога
x - доступ к файлам в каталоге

Если пользователь не имеет права доступа к каталогу на чтение, то он не сможет просматривать его содержимое (не смотря на то, что он может обращаться к файлам из этого каталога напрямую, по имени, если установлен атрибут доступа x).

Если пользователь не имеет права на запись в каталог, он не может менять его содержимое - создавать, удалять и переименовывать файлы. При этом возможны ситуации, парадоксальные с точки зрения здравого смысла :-), но абсолютно логичные с точки зрения ОС. Например, если Вы присвоили своему файлу атрибуты доступа 000 (никто, в т.ч. владелец, не имеет никаких прав), то Вы не сможете прочитать или изменить его содержимое, но легко сможете его... удалить, поскольку у Вас есть право на изменение каталога, в котором лежит файл! :-) И наоборот, если у Вас нет права на запись в каталог, в котором находится файл, и при этом есть право на запись в файл, то Вы можете менять содержимое файла, но не сможете его ни удалить, ни переименовать (поскольку это подразумевает изменение каталога).

Рассмотрев общую картину, давайте перейдем к конкретной - касающейся размещения файлов на веб-сервере хостинга и назначения им необходимых прав доступа.

Начнем с того, что Вы являетесь пользователем того сервера, на котором Вы размещаете сайт, т.е. у Вас есть на нем учетная запись. При регистрации Вам выдаются реквизиты доступа (имя пользователя (login) и пароль), с использованием которых Вы можете входить на сервер тем или иным образом (FTP, веб-интерфейс, SSH, telnet и т.д.) и производить действия от своего имени.

Если Вы создаете файлы на сервере (скажем, закачиваете их по FTP), то Вы становитесь их владельцем и, соответственно, можете менять их атрибуты доступа. Обычно только что созданные файлы имеют атрибуты доступа rw-r--r-- (владельцу разрешены чтение и запись, всем остальным - только чтение).

Для того, чтобы сайт работал, нужно, чтобы:

1. Веб-сервер имел доступ на чтение к Вашим файлам;

2. Ваши CGI-скрипты могли исполняться интерпретатором Perl.

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

Как правило, на большинстве серверов процесс веб-сервера работает как пользователь с минимальными правами доступа. Поэтому для того, чтобы он смог прочитать Ваши HTML-странички и другое "статическое" содержимое (картинки и т.п.), на эти файлы обязательно должен быть разрешен доступ на чтение "всем остальным" (обычно - это "стандартные" rw-r--r--).

На ряде хостингов применяется несколько другая схема - все пользователи хостинга объединены в группу, и "пользователь", под которым работает процесс веб-сервера, также входит в эту группу. Такие хостеры рекомендуют в целях безопасности запрещать доступ "всем остальным" для всех файлов, т.к. в данном случае на веб-сервер "распространяется" не третья группа прав доступа, а вторая - он входит в группу владельца файла (rw-r-----).

Что касается CGI-скриптов на Perl, то тут ситуация несколько иная. Во-первых, файлы CGI-скриптов должны быть исполняемыми (иметь усановленный атрибут x). Во-вторых, при выполнении Вашего скрипта интерпретатор Perl обычно запускается от имени Вашего пользователя и обладает Вашими правами. Следовательно, интерпретатор Perl (и Ваш CGI-скрипт) имеет те же права доступа на внешние файлы данных, что и Вы, т.е. для них "актуальна" первая группа прав доступа.

Если нужно или просто интересно, можно экспериментальным путем определить, как обстоят дела на конкретном хостинге. Для этого нужно закачать на сервер соответствующие файлы и попробовать к ним обратиться, последовательно "обнуляя" группы прав доступа, начиная с последней ("все остальные").

Так, для проверки того, какая из групп прав доступа к Вашим файлам "актуальна" для процесса веб-сервера, можно последовательно присваивать HTML-файлу права доступа rw-r--r-- (644), rw-r----- (640) и rw------- (600), каждый раз запрашивая файл по HTTP. Если веб-сервер "споткнулся" (выдал ошибку вместо страницы) после очередного изменения прав доступа, значит, для него "актуальной" является та группа прав, которую Вы только что "обнулили" (только надо учесть, что броузеры и прокси-сервера умеют кэшировать веб-страницы, поэтому лучше запрашивать URL через кнопку обновления).

Аналогично можно поэкспериментировать с CGI-скриптами и их файлами данных.

В следующем выпуске мы подробно рассмотрим ошибки открытия файлов и различные способы их обработки.

Несколько слов о форуме

А теперь - несколько слов о форуме на сайте нашей рассылки:

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

Во-первых, теперь помещение сообщений в любую "ветку" форума доступно только зарегистрированным пользователям. Т.е. для того, чтобы иметь возможность писать в форум, Вы должны зарегистрироваться на нем. При регистрации обязательной информацией о себе является только e-mail адрес, т.к. он используется форумом для различных уведомлений, в том числе уведомлений о новых сообщениях в интересующих Вас темах.

Во-вторых, теперь регистрация новых пользователей форума подтверждается администратором (Вашим покорным слугой :-) ). Иными словами, если Вы зарегистрировались как пользователь форума, то Вам нужно дождаться подтверждения регистрации, прежде чем Вы сможете писать сообщения. Как только Ваша учетная запись будет проверена и активизирована, Вы получите сообщение по указанному при регистрации e-mail, и далее Вы сможете беспрепятственно пользоваться всеми возможностями форума. :-)

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

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

На сегодня все. До следующих выпусков!


С уважением,
Андрей

angel07@inbox.ru

В избранное