print """Content–Type: text/plain
%s""" % os.environ
С помощью него можно увидеть установленные Web–сервером переменные окружения. Выдаваемый CGI–сценарием web–серверу файл содержит заголовочную часть, в которой указаны поля с мета–информацией (тип содержимого, время последнего обновления документа, кодировка и т.п.).
Основные переменные окружения, достаточные для создания сценариев:
QUERY_STRING
Строка запроса.
REMOTE_ADDR
IP–адрес клиента.
REMOTE_USER
Имя клиента (если он был идентифицирован).
SCRIPT_NAME
Имя сценария.
SCRIPT_FILENAME
Имя файла со сценарием.
SERVER_NAME
Имя сервера.
HTTP_USER_AGENT
Название броузера клиента.
REQUEST_URI
Строка запроса (URI).
HTTP_USER_AGENT
Имя сервера.
HTTP_ACCEPT_LANGUAGE
Желательный язык документа.
Вот что может содержать словарь os.environ
в CGI–сценарии:
{
'DOCUMENT_ROOT': '/var/www/html',
'SERVER_ADDR': '127.0.0.1',
'SERVER_PORT': '80',
'GATEWAY_INTERFACE': 'CGI/1.1',
'HTTP_ACCEPT_LANGUAGE': 'en–us, en;q=0.50',
'REMOTE_ADDR': '127.0.0.1',
'SERVER_NAME': 'rnd.onego.ru',
'HTTP_CONNECTION': 'close',
'HTTP_USER_AGENT': 'Mozilla/5.0 (X11; U; Linux i586; en–US;
rv:1.0.1) Gecko/20021003',
'HTTP_ACCEPT_CHARSET': 'ISO–8859–1, utf–8;q=0.66, *;q=0.66',
'HTTP_ACCEPT': 'text/xml,application/xml,application/xhtml+xml,
text/html;q=0.9,text/plain;q=0.8,video/x–mng,image/png,image/jpeg,
image/gif;q=0.2,text/css,*/*;q=0.1',
'REQUEST_URI': '/cgi–bin/test.py?a=1',
'PATH': '/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin',
'QUERY_STRING': 'a=1&b=2',
'SCRIPT_FILENAME': '/var/www/cgi–bin/test.py',
'HTTP_KEEP_ALIVE': '300',
'HTTP_HOST': 'localhost',
'REQUEST_METHOD': 'GET',
'SERVER_SIGNATURE': 'Apache/1.3.23 Server at rnd.onego.ru Port 80',
'SCRIPT_NAME': '/cgi–bin/test.py',
'SERVER_ADMIN': 'root@localhost',
'SERVER_SOFTWARE': 'Apache/1.3.23 (Unix) (Red–Hat/Linux)
mod_python/2.7.8 Python/1.5.2 PHP/4.1.2',
'SERVER_PROTOCOL': 'HTTP/1.0',
'REMOTE_PORT': '39251'
}
Следующий CGI–сценарий выдает черный квадрат (в нем используется модуль Image
для обработки изображений):
#!/usr/bin/python
import sys
print """Content–Type: image/jpeg
"""
import Image
i = Image.new("RGB", (10,10))
i.im.draw_rectangle((0,0,10,10), 1)
i.save(sys.stdout, "jpeg")
В Python имеется поддержка CGI в виде модуля cgi
. Следующий пример показывает некоторые из его возможностей:
#!/usr/bin/python
# -*- coding: cp1251 -*-import cgi, os
# анализ запроса
f = cgi.FieldStorage()
if f.has_key("a"):
a = f["a"].value
else:
a = "0"
# обработка запроса
b = str(int(a)+1)
mytext = open(os.environ["SCRIPT_FILENAME"]).read()
mytext_html = cgi.escape(mytext)
# формирование ответа
print """Content–Type: text/html
Решение примера: %(b)s = %(a)s + 1
%(b)s
%(mytext_html)s
""" % vars()
В этом примере к заданному в форме числу прибавляется 1. Кроме того, выводится исходный код самого сценария. Следует заметить, что для экранирования символов >
, <
, &
использована функция cgi.escape()
. Для формирования Web–страницы применена операция форматирования. В качестве словаря для выполнения подстановок использован словарь vars()
со всеми локальными переменными. Знаки процента пришлось удвоить, чтобы они не интерпретировались командой форматирования. Стоит обратить внимание на то, как получено значение от пользователя. Объект FieldStorage
«почти» словарь, с тем исключением, что для получения обычного значения нужно дополнительно посмотреть атрибут value
. Дело в том, что в сценарий могут передаваться не только текстовые значения, но и файлы, а также множественные значения с одним и тем же именем.
Осторожно!
При обработке входных значений CGI–сценариев нужно внимательно и скрупулезно проверять допустимые значения. Лучше считать, что клиент может передать на вход все, что угодно. Из этого всего необходимо выбрать и проверить только то, что ожидает сценарий.
Например, не следует подставлять полученные от пользователя данные в путь к файлу, в качестве аргументов к функции eval() и ей подобных; параметров командной строки; частей в SQL–запросах к базе данных. Также не стоит вставлять полученные данные напрямую в формируемые страницы, если эти страницы будет видеть не только клиент, заказавший URL (например, такая ситуация обычна в web–чатах, форумах, гостевых книгах), и даже в том случае, если единственный читатель этой информации — администратор сайта. Тот, кто смотрит страницы с непроверенным HTML–кодом, поступившим напрямую от пользователя, рискуют обработать в своем браузере зловредный код, использующий брешь в его защите.
Читать дальше
Конец ознакомительного отрывка
Купить книгу