Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
MUMPS СУБД. Практика применения и опыт программирования.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
6.4. WEB 431
|expression|
как инструкции по генерации кода. Пример синтаксиса из документации:
<%@Language=Cache@%> <%
Set date="" For Set date=$Order(^Contact(date)) Quit:date="" D List G End ; jump past the HTML that lists the contacts ;
List ; get the details
Set d=^Contact(date) Set VisitDate=date Set Contact=$P(d,"#",1) Set Notes=^Contact(date,"notes") ; now display the list
%>
<hr> Date: |VisitDate|<br> Our contact: |Contact|<br> Notes of visit: |Notes|<br> <br>
<%
Quit End ; %>
При обработке такой страницы фактически генерируется рутина на MUMPS так, что все содержание страницы, не входящее в служебные теги, заменяется на команды вывести это содержание в текущее устрой­ство. В служебных тегах могут быть организованы подпрограммы, пе­реходы на метки, может быть использован блочный синтаксис. В при­веденном примере вывод данных Date, Contact и Notes производится в цикле, как часть подпрограммы List.
По той же схеме выполняется обработка условных тегов, в них пи­шется переход на метку с служебном теге:
<%@Language=Cache@%> <%
If condition1 goto Cond1 %> <p>This is some HTML to display ...etc <%
Goto End
432 ГЛАВА 6. ВНЕШНИЙ МИР
Cond1 ; %> <p> Here is the alternative HTML to display ...etc <% End ; %> <p> continue with the rest of the page
WebLink также поддерживает генерацию HTML кода для элементов управления путем присваивания в коде MUMPS значений специальным зарезервированным локальным переменным.
При процессировании всех страниц WebLink производит замену имен ссылок со страниц PageName.asp на вызов ISAPI модуля так, что все необходимые служебные параметры автоматически передаются в URL в виде:
http://server/scripts/mgwms32.dll?MGWLPN=My_LPN&wlapp=Contacts
При работе этот модуль обработки автоматически определяет по ском­пилированному WebLink приложению и его служебным данным, какую рутину необходимо вызвать, как и какие параметры передать.
Страница WebLink может управлять генерацией заголовков HTTP ответа, используя специальный тег <HTTP>, при обработке которого также выполняется подстановка параметров:
<HTTP> HTTP/1.0 200 OK Content-type: text/html Set-Cookie: MyCookieName=MyCookie|number|;
path=/; expires= Fri 08-Jan-1999 13:00:00 GMT </HTTP> <HTML>
Перед выполнением страницы в контексте MUMPS процесса созда­ются необходимые служебные локальные переменные с переменными окружения, которые страница может использовать при необходимости.
К интересным возможностям приложений WebLink относятся меха­низм передачи событий и параметров с клиентской стороны (браузер) на сервер (MUMPS). Например, если есть поле ввода, то можно установить обработчик события его изменения на серверной стороне и процессор WebLink при компиляции приложения автоматически сгенерирует код передачи таких событий и их параметров:
6.4. WEB 433
<INPUT TYPE=TEXT NAME=Username
ActionOnChange=Mytest(Info,Password)> ... <SCRIPT Language=Cache>
//type=actions
Mytest(Info,Password) ; Test the username
... ... Quit
</SCRIPT>
WebLink работает с InterSystems Cach´e (NT, UNIX), а также с систе­мами DSM и MSM (NT). Модуль разрабатывается фирмой M/Gateway Developments Ltd и, кроме него, фирма M/Gateway также выпускает множество модулей для WEB разработки с использованием MUMPS си­стем.
Что интересно, WebLink комплектуется программой для разработчи­ков WebLink Developer, который выполняет все необходимые действия по подготовке веб приложения для WebLink. Сам WebLink Developer выполнен также в веб интерфейсе.
6.4.5 MWA
MWA (MiniM Web Access) это модуль для промышленных WEB сер­веров, таких как Apache, IIS, и других, поддерживающих стандартные соглашения о CGI модулях.
Технологически модуль MWA является CGI фильтром - браузер по­лучает запрос к файлу, но вместо возврата его содержания этот файл передается модулю, модуль его использует для генерации ответа, и уже ответ передается вебсервером обратно HTTP клиенту.
Для генерации ответа модуль запускает MUMPS процесс и, в зависи­мости от встреченных синтаксических конструкций, передает управле­ние процессу, либо самостоятельно отдает в содержание какие-то фраг­менты обрабатываемого файла.
В настройках вебсервера производится ассоциирование типа файла по расширению (mwa) с обработчиком MWA CGI и запрос к странице производится указанием файла mwa:
http://server/dir/page.mwa?param=value&...
Сам файл mwa является текстовым, и в нем все содержание отдает­ся вебсерверу как ответ, за исключением синтаксических конструкций выделенных тегами
434 ГЛАВА 6. ВНЕШНИЙ МИР
<?name arguments ?>
Здесь name - имя MWA тега, а arguments - аргументы тега. Все встреченные MWA теги обрабатываются MWA процессором и, в зависи­мости от тега, процессор либо самостоятельно заменяет тег на соответ­ствующее ему содержание, либо передает управление MUMPS процессу, чтобы вычислить значение либо выполнить MWA тег.
MWA теги образуют по совокупности возможностей небольшой язык программирования, где часть операций выполняется на стороне процес­са MiniM на языке MUMPS. Например, тег include включает указанный другой файл, тег eval вычисляет значение выражения и оно подставля­ется вместо тега, тег if пропускает или включает часть тела страницы до следующего условного тега, а тег while организует циклы обработки.
Кроме генерации содержания, MWA теги управляют заголовками от­вета, чтобы задать веб баузеру, что он получает страницу HTML, данные XML, файл PDF, графический файл или другое.
Структурно выполнение MWA страниц полностью аналогично таким технологиям как PHP или ASP. При обработке файлов не генерируют­ся промежуточные элементы, рутины, временные файлы, файлы MWA не компилируются, и для обновления приложения необходимо только обновить MWA файлы (останов вебсервера не требуется).
Например, страница с содержанием
<html><body> Сегодня: <b><?eval $zd($h,13) ?></b> </body><html>
генерирует HTML (тип ответа по умолчанию) страницу с текущей датой.
В контексте MUMPS процесса, обслуживающего страницу при гене­рации, все параметры запроса и переменные окружения доступны в виде локальных переменных.
6.4.6 CSP
CSP (Cache Server Pages) это технология как фильтра файлов (CSP страницы), так и обработка специального расширения (CLS), соответ­ствующего сущности базы данных (класс). В настройках вебсервера (поддерживаются и IIS и Apache, причем на различных операционных системах) указывается что определенные расширения должны обраба­тываться процессором CSP. Это может быть, в зависимости от версии или операционной системы, как стандартный CGI, так и ISAPI модуль.
6.4. WEB 435
Страница может быть создана как файл формата HTML, при первом к нему обращении процессор генерирует эквивалентный по функцио­нальности код в виде класса Cache Object Script. Дальнейшая работа по генерации HTTP ответа выполняется этим классом. Если по странице CSP сгенерирован и скомпилирован соответствующий ей класс, то даль­ше можно обращаться не только к файлу, но и к самому классу, точно таким же образом, но указывая расширение CLS. Более того, если класс создан по определенным правилам, то файл CSP не требуется.
Все HTML теги, встреченные в странице процессором CSP, обрабаты­ваются с заменой на вызов соответствующих этим тегам классов. Любой из HTML тегов можно переопределить. В зависимости от определения того, на что заменять тег, он может быть заменен на вывод просто тек­ста командой WRITE или на обращение к определенному классу, чтобы его функции вывели необходимое содержание. У тега поддерживаются атрибуты, также передаваемые соответствующим классам.
Разработчики могут определить собственные правила как необходи­мо обрабатывать определенные теги, задав эти правила в CSR. Это файл определения класса в специальной разметке, где указано при каких си­туациях какие действия по генерации кода необходимо выполнять. Дей­ствия могут быть отнесены как на этап компиляции, так и на этап выпол­нения. Правило обработки тега CSR получает и атрибуты, и содержание тега, и контекст его работы. Также можно определять обработчик тега в зависимости от того, в какой из тегов он вложен.
Разработчики могут определить через CSR большой набор компонен­тов таким образом, чтобы указывать на странице CSP не громоздкий код, а компактный собственный тег. В какой-то мере стандартные теги HTML также заданы набором таких правил CSR.
Генерируемый по файлу CSP класс содержит набор методов, вызыва­емых для обработки определенного фрагмента страницы. Разработчики в самой странице CSP могут также определить собственные методы для будущего класса. В теле самой страницы разработчики могут свободно смешивать код HTML, код JavaScript, передаваемый клиентской стороне и код Cache Object Script, используемый либо для генерации страницы, либо для обработки событий страницы.
В случае если по CSP странице получается очень большой класс (по объему кода), то компилятор классов автоматически переносит часть кода по нескольким рутинам.
В состав технологии CSP входит кроме обработки страниц также работа с авторизацией, поддержка сессий, передача обработки событий с клиента на сервер.
Процессор CSP кроме обработки тегов также поддерживает макро-
436 ГЛАВА 6. ВНЕШНИЙ МИР
подстановки и специальные макроподстановки CSP.
Положим, в коде CSP страницы есть фрагмент:
<b>Hello!</b>
При его обработке получается выполняющийся на стороне сервера
при генерации HTTP ответа код
Write "<b>Hello!</b>",!
Этот код уже генерирует отдаваемый клиенту фрагмент
<b>Hello!</b>
Если встречаются специальные символы макроподстановок то они рассматриваются либо как подстановки этапа компиляции либо подста­новки этапа выполнения. Если встречается код вида
##(expr)##
То он вызывается однократно на этапе компиляции и результат встав­ляется в вывод страницы:
This page was compiled on: <b>##($ZDATETIME($H,3))##</b>
заменяется на
Write "This page was compiled on:",! Write "<b>2000-08-10 10:22:22</b>",!
Если же встречается конструкция вида
#(expr)#
то она заменяется на вычисление выражения expr при выполнении каж­дый раз:
This page was executed on: <b>##($ZDATETIME($H,3))##</b>
заменяется на
Write "This page was compiled on:",! Write "<b>",$ZDATETIME($H,3),"</b>",!
6.4. WEB 437
Кроме кода на языке Cache Object Script, разработчик может добавить
классу SQL запрос, объявив его тегом
<script language=SQL>
и используя в дальнейшем в функциях на COS.
За счет того, то каждый из тегов HTML, встреченных при обработке, заменяется на соотвветствующим образом определенный ему код, под­держивается набор тегов управления CSP:IF / CSP:WHILE / CSP:LOOP.
Кроме генерации содержания HTTP ответа, разработчику CSP стра­ниц также доступно управление заголовками HTTP ответа с тем, чтобы веб клиент колучал корректное описание ответа. В частности, можно указать что передается не HTML страница (тип ответа по умолчанию), а XML или графический файл. Путем обращения к методам базового класса, от которого наследуется CSP класс, можно управлять куками, перенаправлять на другую страницу, и управлять другими операциями, характерными для HTTP протокола.
Одной из значимых возможностей технологии CSP является встро­енная поддержка HiperEvent - передача обработчиков событий с кли­ента на сервер. Если на CSP странице процессор встречает обращение из JavaScript кода к серверному методу, то на страницу автоматически помещается код вызова такого события. Код обращается к серверу без перезагрузки всей страницы, вызывая специальную страницу брокера за­просов. CSP процессор автоматически генерирует для него код передачи параметров и приема возвращаемого значения.
Технология CSP используется во множестве как Intranet проектов, так и Internet сайтов.

6.4.7 Проблемы HTTP

К общим проблемам применения MUMPS систем для генерации HTTP ответов относятся следствия самой природы обмена данными по HTTP и они не связаны со спецификой собственно самих MUMPS систем. К ключевым проблемам могут быть отнесены следующие, хотя в каких-то ситуациях могут иметь значение и другие:
1. Работа в недоверительной среде Internet, когда в параметрах за­проса могут прийти непредусмотренные разработчиками данные.
2. Непредсказуемое количество процессов для обслуживания потока запросов, в отличие от Intranet приложений с прогнозируемой ак­тивностью.
438 ГЛАВА 6. ВНЕШНИЙ МИР
3. Отсутствие постоянного соединения в течении всего времени ра­боты Internet - приложения и соединение с сервером только для генерации отдельных порций.
При работе в среде интернет к приложению предъявляются допол­нительные требования, о которых разработчики иногда не задумыва­ются. При небрежном отношении к проектированию программного ин­терфейса и к входным данным могут создаваться уязвимости. Входные данные, принимаемые через параметры запроса, присылаются внешними средствами. Неправильно будет полагать, что параметры будут присла­ны только и исключительно со страниц разрабатываемого веб прило­жения. Формально говоря, на стороне сервера невозможно достоверно установить даже то, что запрос пришел именно от браузера, посколь­ку произвольные запросы могут быть сформированы любой программой, работающей с сокетами TCP/IP.
На серверной стороне при приеме параметров необходимо в любом случае, даже в самой незначительной на первый взгляд странице, вни­мательно относиться к использованию значений параметров. В среде выполнения MUMPS, как и во многих других с возможностью динами­чески конструировать выполняемое или вычисляемое выражение, зача­стую с целью облегчения работы параметры могут быть использованы как часть синтаксической конструкции. На языке MUMPS к таким кон­струкциям относятся команды XECUTE, косвенность команд и меток, а также возможные нюансы поведения определенных версий MUMPS систем.
После написания обработчика веб страницы, а еще лучше до, необхо­димо проверить, как обработчики используют недоверительные данные. Нужно проверить все команды XECUTE, которые выполняют строки ко­манд, сконструированные с использованием входных параметров. Про­граммисту нужно оценить, можно ли в такие параметры вписать код, не предусмотренный разработчиком так, чтобы он выполнился. Точно также необходимо проверить все синтаксические конструкции, использующие косвенность.
Приведем простой пример. Положим, что в параметре запроса
http://server/dir/page?id=1234
значение параметра id используется для подстановки
; значение переменной id получено из параметра x "s abc="_id
6.4. WEB 439
В этом случае в параметрах можно передать произвольные выполня-
емые команды, например
http://server/dir/page?id=1234%20k%20^DATA
что в результате выполнения команды XECUTE приведет к выполнению кода
s abc=1234 k ^DATA
В случае использования косвенности команд также существует воз­можность выполнения постороннего кода. У MUMPS систем могут быть нюансы выполнения косвенности команд, в частности существуют систе­мы, которые выполняют косвенную форму команды как вариант команды XECUTE, например в одной из систем может выполняться:
USER>s @"a=123 w 123"
<SYNTAX> :SET ARGUMENT: *a=123 w 123
и при этом тот же код в другой системе:
USER>s @"a=123 w 123" 123
Кроме того, в стандартном выполнении косвенности имен допускается синтаксическая конструкция с вычислением значений индексов, напри­мер:
s @"a($h)"=123
Конечно, существует возможность принять параметр веб страницы для конструирования полного имени:
s @"a("_id_")"=123
Но нужно понимать при этом, что в такой конструкции может испол­няться произвольный передаваемый извне код, например пусть передано
http://server/dir/page?id=$v(FormatDiskCommand)
тогда будет выполнена системная функция с нехорошим побочным эф­фектом.
Если нужно подставить значение параметра в качестве индекса, то нужно использовать значение переменной строго как значение индекса:
440 ГЛАВА 6. ВНЕШНИЙ МИР
s a(id)=123 или s name=$na(a) ... s @name@(id)=123
В таких случаях значение параметра не исполняется как команда и
не вычисляется как выражение.
При просмотре кода на предмет скользких мест необходимо так­же просмотреть его на предмет остальных форм косвенности, включая применение косвенности меток, и сопоставить возможность подстанов­ки в параметры непредусмотренных данных с поведением применяемой MUMPS системы в таких случаях.
Уязвимости такого рода обычно называют уязвимостями класса Code Injection, например SQL Injection или JavaScript Injection. В данном слу­чае это будет MUMPS Injection.
Проблема непрогнозируемого количества запросов вызвана тем, что в среде интернет может произойти наплыв посетителей на страницы сайта по ссылкам с популярных ресурсов и на обслуживание могут понадо­биться тысячи процессов сервера. Кроме проблемы физической способ­ности используемого в качестве сервера компьютера выполнять столь­ко процессов одновременно, также стоит вопрос о пределах лицензии на применяемую MUMPS систему если это коммерческая система. При эксплуатации в среде интернет серверов с лицензированием, конечно, необходимо проверить, подходит ли выбранная лицензия или программ­ные решения по ограничению входящих соединений для обслуживания пика запросов.
К третьей проблеме веб приложений относится проблема отсутствия постоянного соединения в том виде, как оно используется в клиент ­серверных или терминальных приложениях. Любая страница разрабо­танного веб приложения может быть запрошена в любое время. И, во­обще говоря, нет возможности принудить пользователей (а тем более поисковые системы) попадать на страницы приложения строго в опреде­ленной последовательности и передавать строго определенные и только предусмотренные параметры.
Передаваемые параметры могут не соответствовать реальным данным в базе данных, и приложение должно относиться к ним как к возможно несуществующим.
В приложениях, где используются авторизация пользователя либо произвольная форма связывания контекста веб приложения с текущим пользователем, необходимо применять дополнительные меры по работе с куками или передавать дополнительные параметры.