ИВАН КОРОБКО
Переходим от VBScript к ASP и ASP.NET
Безопасность и синтаксис
Многие программисты используют VBScript для создания сценариев, предназначенных для управления серверами. Некоторые скрипты настолько усложняются, что их трудно использовать без графического интерфейса. Оптимальным решением этой задачи является создание вебприложения на ASP, ASP.NET.
Создавая сценарии на VBScript для обслуживания серверов, таким образом автоматизируя работу системного администратора и службы технической поддержки, сводя до минимума влияние человеческого фактора, программисты приходят к выводу, что некоторые из их скриптов стали неудобными и им необходим графический интерфейс. Например, веб-интерфейс, выбор которого объясняется соображениями безопасности и удобством эксплуатации. Для решения этой задачи рекомендуется ASP, а лучше всего – ASP.NET, который позволяет на порядок повысить безопасность работы приложения.
От VBScript к ASP
У вас может возникнуть вопрос: «Зачем мне переходить на ASP, когда я просто могу использовать DHTML с VBS вставками?» Использовать DHTML или HTA для этих целей не получится, поскольку они основаны на HTML, который действительно позволяет делать вставки на VBScript, однако не поддерживают работу с OLE-объектами. Для программиста, создающего приложения для обслуживания серверов, поддержка OLE-объектов используемой им средой – основное требование, поскольку формирование отчетов, доступ к Active Directory и др. базируется на их использовании.
ASP представляет собой решение, которое поддерживает HTML, OLE-объекты и позволяет делать вставки на различных скриптовых языках: VBScript, JScript.
Переход от VBScript к ASP достаточно прост и безболезнен: исходный код на VBScript остается практически без изменений.
ASP-страницы – это сценарии, программный код которых выполняется при их запросе. Результатом действия скрипта является DHTML-страница, которая формируется на сервере, а затем отображается в браузере клиента. Структура документа на ASP проста: в первой строке всегда указывается язык, с помощью которого созданы скриптовые вставки ASP-страницы. Первая строка любого из сценариев на ASP выглядит следующим образом:
<%Script Language="VBScript"%>
или
<%Script Language="JScript"%>
Программный код, находящийся между <% и %>, выполняется на сервере и подчинен синтаксису одного из выбранных языков. Весь остальной код представляет собой HTML-страницу в явном виде.
Листинг типовой ASP-страницы выглядит следующим образом:
<%@ Language=VBScript CODEPAGE=1251%>
<HTML>
<TITLE> Заголовок страницы </TITLE>
<HEAD>
<LINK href="../style.css" type=text/css rel=stylesheet>
<meta http-equiv="Content-Type" content="text/html" charset=windows-1251>
</HEAD> <BODY>
<FONT FACE="Arial">
…
<%
…
' отображение на экране содержимого переменной
Response.write variable
%>
После обработки интерпретатором IIS программного кода и преобразования результатов его работы в HTML/DHTML необходимо дать команду на отображение страницы в браузере клиента. Такой командой является «Response.Write q», где q – имя переменной, содержащей фрагмент HTML-кода.
Необходимо отметить, что ASP имеет свою, хотя и скромную объектную модель, описание которой можно найти практически в любой книге, посвященной программированию на ASP в разделе «Приложения».
Настройка IIS для ASP
При создании веб-приложений на основе ASP необходимо учитывать некоторые особенности этого языка.
Первая особенность: поскольку код ASP-страниц исполняется на сервере и только результат в виде HTML-страницы пересылается на клиентскую машину, то для успешного запуска приложения на сервере пользователь должен обладать соответствующими правами. IE, IIS и запускаемые им сервисы представляют собой трехзвенную систему (см. рис. 1).
Рисунок 1. Трехзвенная система
Пусть IIS имеет настройки по умолчанию. В этом случае при загрузке любой ASP-страницы она стартует от имени встроенного пользователя (см. рис. 2). Если страница работает с некими базами данных, например с Active Directory, то пользователь, запускающий данную страницу, должен обладать соответствующими правами системного администратора.
Рисунок 2. Настройка безопасности IIS
Существует несколько способов соблюсти эти условия. Первый – учетную запись встроенного пользователя заменить учетной записью администратора сети. При таком раскладе любой пользователь в сети сможет посетить данную страницу, т.к. она будет запускаться от имени системного администратора. Этот способ предоставляет всем доступ к данной странице, что, согласитесь, неправильно: резко снижается безопасность всей системы. В случае ошибок на странице злоумышленник может легко запустить вредоносный код с правами администратора.
Поэтому разумно использовать другой способ, с помощью которого можно ограничить доступ к ресурсам. В настройках IIS необходимо сбросить флажок (см. рис. 2) с Enable anonymous access и установить его напротив Basic Authentication. Также следует изменить права на файловую структуру используемого сайта, исключив оттуда группу Everyone и добавив соответствующие группы безопасности и назначить им соответствующие права. При такой настройке IIS только системные администраторы получат доступ к данной странице. При попытке любого пользователя, не являющегося администратором сети, получить доступ к странице, IIS будут запрошены имя и пароль пользователя.
Если необходимо расширить круг лиц, которым должен быть доступен данный сайт, и при этом пользователи не являются системными администраторами, то можно воспользоваться вариантом, являющимся синтезом двух ранее изложенных решений. Ограничить доступ на сайт с помощью Basic Authentication и правами на файловую структуру, запускать скрипт, инкапсулированный в страницу, с правами администратора.
Только что мы рассмотрели механизм взаимодействия первого и второго звена в трехзвенной системе. Первым звеном является рабочая станция пользователя, вторым –сервер, на котором установлен IIS. Взаимосвязь этих звеньев осуществляется с помощью одного пользователя. Между вторым и третьим звеном (сервер iis-процессы, порождаемые из asp-процесса) взаимодействие осуществляется с помощью другого пользователя.
Рассмотрим взаимодействие второго и третьего звена подробнее.
При запуске из кода ASP-страницей какого-либо приложения осуществляется взаимодействие между вторым и третьим звеном. IIS порождает процесс, запускаемый от имени другого встроенного пользователя. Поскольку ASP-страница выполняется на сервере, то для запуска приложения необходимы соответствующие права. Управление этой учетной записью пользователя осуществляется в Application Tools (см. рис. 3).
Рисунок 3. Настройка безопасности IIS
Переход от VBScript и ASP к ASP.NET
Теперь, когда мы знакомы c ASP и разобрались с настройкой IIS для ASP-проектов, подведем промежуточный итог, а он не утешителен! Дело в том, что в построенной системе большая брешь в безопасности; поскольку для доступа к АD в ASP-файле в явном виде надо указать имя и пароль системного администратора, еще одним недостатком является указание пароля в разделе «Аnonymous Аccess» вместо встроенной учетной записи указать имя и пароль системного администратора. Конечно, системный администратор постарается защитить файловую систему соответствующим распределением прав, однако принятых мер недостаточно. Необходимо сделать так, чтобы система сама определяла и подставляла имя и пароль пользователя между вторым и третьим звеном, т.е. запускала сервисы от имени пользователя, который вошел на сайт. Поставленная задача успешно решается переходом с помощью ASP.NET и включением режима имперсонализации.
Установка Visual Studio
Перед установкой Visual Studio .NET должен быть предварительно установлен пакет программ, необходимых для ее установки:
- Microsoft IIS 5/6
- Microsoft .NET Framework 1.1/2.0
- Microsoft FrontPage Server Extensions 2000/2002
- Microsoft Visual J# .Net Redistributable Package 1.1/2
- Microsoft Windows Installer 2/3(.1)
В полном дистрибутиве перечисленные компоненты находятся в папке WCU, в которой присутствуют соответствующие компонентам подпапки. Если же папки WCU нет, то компоненты необходимо загрузить с сайта Microsoft или установить с дистрибутива соответствующей версии операционной системы.
Таблица 1. Необходимые компоненты для установки Visual Studio
После завершения установки необходимых подпрограмм следует запустить процесс установки студии, после завершения которого необходимо перезапустить ОС и проверить ее работоспособность, создав проект.
Замечание. Для установки Visual Studio без проверки установленных компонентов необходимо запустить процесс установки с ключом:
X:SETUPSETUP.EXE /NO_BSLN_CHECK
Что такое FRAMEWORK
Компания Microsoft поддерживает одновременно несколько языков программирования: Visual Basic, C++, C#. Большая часть функциональных возможностей этих языков совпадает: в каждом из них реализована работа с файловой системой, с базами данных, обработка строк, математические функции. Более того, некоторые из них поддерживают идентичные функции, операторы цикла и условные операторы. Наконец, многие из них имеют похожие типы данных.
Поддержка одних и тех же функциональных возможностей для нескольких языков программирования требует немалых усилий от разработчика, поэтому программисты компании Microsoft задумались над тем, как уменьшить трудозатраты. Результатом их деятельности является библиотека классов .Net Framework Class Library, которая состоит из множества классов, предназначенных для решения различных задач, которые могут встать перед программистом. В настоящее время активно используется .Net Framework, однако все большую популярность приобретает недавно вышедший .Net Framework 2.0.
Пространство имен платформы .Net содержит более 3400 классов, которые организованы в иерархию пространств имен. Например, пространство имен, связанных с работой файловой системы, называется System.IO.
Существует два способа импорта пространств имен в зависимости от метода программирования. Оба они будут рассмотрены ниже на примере импорта пространства имен System.Security.Principal для проверки режима имперсонализации.
Управление доверительными отношениями в ASP NET
Для конфиденциальной работы приложения IIS всегда важно идентифицировать процесс, в котором она выполняется. По умолчанию в IIS 5.0 процессы запускаются утилитой ASPEN_WP.EXE от имени встроенной учетной записи «PC_NAMEASPNET», а в IIS 6.0 – от имени «NT AUTHORITYNETWORK SERVICE».
По умолчанию режим имперсонализации выключен. Для его включения необходимо сделать изменения в конфигурационном файле: C:WindowsMicrosoft.NETFrameWorkV номер версииConfigMachine.Config.
Необходимо присвоить следующие значения:
comAuthenticationLevel= PktPrivacy
comImpersonationLevel= Impersonate
Список возможных значений этих параметров приведен ниже:
comAuthenticationLevel="Default|None|Connect|Call|Pkt|PktIntegrity|PktPrivacy";
comImpersonationLevel="Default|Anonymous|Identity|Impersonate|Delegate"
Для IIS6 необходимо сделать изменения в реестре. В ветви реестра «HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesW3SVCParameters» необходимо добавить четыре параметра: AuthentionLevel, CoInitializeSecurityParam, ImpersonationLevel, AuthenticationCapabilities (см. риc. 4).
Рисунок 4. Параметры имперсонализации для IIS6
Параметр CoInitializeSecurityParam принимает значения 0 и 1. Отвечает за включение/отключение использования остальных трех. Все параметры имеют тип REG_DWORD. Описания остальных трех параметров см. в таблице 2.
Таблица 2. Принимаемые значения параметров имперсонализации для IIS6
Имя параметра
|
Значение
|
AuthentionLevel
|
Default
|
0
|
None
|
1
|
Connect
|
2
|
Call
|
3
|
Pkt
|
4
|
PktIntegrity
|
5
|
PktPrivacy
|
6
|
ImpersonationLevel
|
Default
|
0
|
Anonymous
|
1
|
Identity
|
2
|
Impersonate
|
3
|
Delegate
|
4
|
AuthenticationCapabilities
|
None
|
0x0
|
Mastual_Auth
|
0x1
|
Secure_Refs
|
0x2
|
Access_Control
|
0x4
|
APPID
|
0x8
|
Dynamic
|
0x10
|
Static_Cloaking
|
0x20
|
Dynamic_Cloaking
|
0x40
|
ANY_Authority
|
0x80
|
Make_FullSic
|
0x100
|
Require_FullSic
|
0x200
|
Auto_Impersonate
|
0x400
|
Default
|
0x800
|
Disable_Aaa
|
0x1000
|
No-Custom_Marshal
|
0x1200
|
Для включения имперсонализации рекомендуется присвоить перечисленным параметрам следующие значения: CoInitializeSecurityParam=1, AuthentionLevel=6, ImpersonationLevel=3, AuthenticationCapabilities=12352.
В каждом создаваемом проекте автоматически генерируется файл Web.Config, в который также необходимо внести изменения, чтобы включить режим имперсонализации:
<?xml version=»1.0» encoding=»utf-8» ?>
<configuration>
<system.web>
<identity impersonate =»true»/>
<authentication mode=»Windows» />
</system.web>
</configuration>
Если необходимо, чтобы механизм имперсонализации работал от имени одного и того же пользователя, то необходимо указать логин и пароль учетной записи в поле :
<identity impersonate ="true" username="user/domain" password="" />
Проверка имперсонализации осуществляется с помощью функции WindowsIdentity.GetCurrent().Name, которая возвращает имя учетной записи пользователя, от которой будут запускаться процессы.
Если программный код формируется непосредственно в ASPX-файл, то в его заголовке необходимо импортировать пространство имен System.Security.Principal (2-я строчка примера – см. рис. 5).
Рисунок 5. Пример импортирования пространства имен System.Security.Principal в ASPX-файле
В случае обработки событий в виде функций, необходимо перед описанием класса импортировать пространство имен, о котором уже шла речь, и привязать код к событию, например, к нажатию на кнопку. Для этого сначала необходимо создать в ASPX-файле кнопку (Button1) и в теле соответствующей функции, по умолчанию Button1_Click() добавить функцию WindowsIdentity.GetCurrent().Name (см. рис. 6).
Рисунок 6. Пример импортирования пространства имен System.Security.Principal в VB-файле
При включенной имперсонализации на странице должно отобразиться текущее доменное имя пользователя в формате Domain/LogonUser.
Переход от VBScript к ASP.NET
По своей сути ASP представляет собой HTML со вставками VBScript или Jscript (в общем случае), при этом ASP, в отличие от HTML, работает с OLE-объекты. Это принципиальная разница между ASP и DHTML. Вставки на VBScript практически не претерпели изменений за некоторым исключением. Переход от ASP к ASP.NET также достаточно прост, однако есть ряд принципиальных отличий. Об особенностях перехода между этими тремя языками и пойдет речь.
Таблица 3. Сопоставления вызываемых файлов соответствующим приложениям
|
|
ASP
|
ASP.NET
|
Расширение
|
*.vbs
|
*.asp
|
*.aspx
|
Обработчик
|
|
Asp.dll
|
Aspnet_isapi.dll
|
Файлы ASP корректно работают под ASP.NET
Для страниц ASP.NET фактически приемлемы любые расширения, в том числе и ASP. Для того чтобы ASP-страницы распознавались файлами платформы ASP.NET, необходимо проделать следующие манипуляции. Изменить ассоциацию ASP-файлов:
- Запустить Internet Services Manager («Start Programs Administrative Tools Internet Services Manager»).
- Открыть страницу свойств нужного веб-узла, щелкнув правой кнопкой мыши по нужному узлу и выбрав пункт «Properties».
- В появившемся диалоговом окне войти во вкладку «Home Directory».
- В разделе «Application Settings» нажать на кнопку «Configuration».
- В появившемся диалоговом окне «Application Configuration» выбрать вкладку «App Mapping».
- Ассоциировать файлы с расширением ASP с библиотекой aspnet_isapi.dll. При этом предварительно необходимо удалить предыдущую ассоциацию ASP.
Внести изменения в конфигурационный файл .NET Framework:
- Открыть файл machine.config с установленным на компьютере IIS, который находится в C:WindowsMicrosoft.NETFramework[version]config.
- В разделе [httpHandlers] приведены обработчики для файлов с различными расширениями. В нем должны присутствовать «.asp, .aspx».
- Необходимо добавить обработчик System.Web.Ui.PageHandlerFactory:
<add
verb="*.*"
path="*.asp"
type=" Web.Ui.PageHandlerFactory,
System.Web,
Version=1.0.2411.0,
Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a
"/>
Оператор Option Explicit
Рассмотрим использование оператора Option Explicit для VBScript, ASP и ASP.NET.
VBScript, ASP
По умолчанию в VBScript допускается неявное объявление переменных. При этом переменная создается без ее предварительного объявления операторами Dim, Private, Public или ReDim. Однако, разрешив неявное объявление переменных в сценариях, велик риск пропустить допущенную синтаксическую ошибку в имени переменной во время программирования.
В том случае, если допущена ошибка, VBScript просто объявит новую переменную и создаст ее, вследствие чего программа будет работать некорректно. Для обнаружения ошибок-опечаток такого рода в первую строку программы необходимо поместить оператор Option Explicit, который сигнализирует оператору о переменных, которые не были объявлены явно.
ASP.NET
Опция Explicit, выключенная по умолчанию в предыдущих версиях ASP, на платформе ASP.NET включена. При включении перед использованием переменной ее необходимо объявить. Например, приведенный ниже сценарий успешно работает на ASP, но на ASP.NET он вызовет ошибку – «The name ‘strMsgBox’ is not declared»:
<%
strMsgBox="Привет"
response.write(strMsgBox)
%>
Исправить ошибку можно двумя способами. Первый способ – объявить переменную strMsgBox явным образом:
<%
Dim strMsgBox As String
strMsgBox="Привет"
response.write(strMsgBox)
%>
Второй способ – отключить на всех страницах ASP.NET в файле machine.config опцию Explicit:
<Compilation>
Explicit = "False"
</Compilation>
Преобразование типов данных
В языке VBScript отсутствуют требования жестко привязать переменную к определенному типу. В нем нельзя объявить тип переменной, в результате чего все создаваемые переменные принадлежат к типу Variant. В ASP.NET этот тип данных не поддерживается. Своеобразным его эквивалентом является тип object. Рассмотрим пример сценария, в котором объявим переменную, и присвоим ей значение, после чего выведем его на экран. В качестве шаблона воспользуемся примером из предыдущего параграфа:
<%
Dim strMsgBox
strMsgBox="Привет"
response.write(strMsgBox)
%>
Обратите внимание, что при объявлении переменной strMsgBox не указан ее тип явным образом, поэтому считается, что она принадлежит к типу Object. При присвоении значения переменной осуществляется автоматическое преобразование к типу String.
Автоматическое преобразование к нужному типу данных очень удобно, однако оно негативно сказывается на скорости работы сценария.
Для определения типа переменной используйте функцию VarType(), возвращающую число, которому соответствует подтип (см. таблицу 4).
Таблица 4. Расшифровка принимаемых значений функцией VarType()
Константа
|
Значение
|
Описание
|
vbEmpty
|
0
|
Empty (пустое значение)
|
vbNull
|
1
|
Null (не содержит данных)
|
vbInteger
|
2
|
Integer
|
vbLong
|
3
|
Long integer
|
vbSingle
|
4
|
Single (число с плавающей точкой)
|
vbDouble
|
5
|
Double (число с плавающей точкой)
|
vbCurrency
|
6
|
Currency
|
vbDate
|
7
|
Date
|
vbString
|
8
|
String
|
vbObject
|
9
|
Объект
|
vbError
|
10
|
Error
|
vbBoolean
|
11
|
Boolean
|
vbVariant
|
12
|
Variant (используется только с массивами)
|
vbDataObject
|
13
|
Object
|
vbByte
|
17
|
Byte
|
vbArray
|
8192
|
Array
|
Синтаксис:
- VarType(VarName);
- Varname – имя переменной, содержащей значение.
При работе с массивами функция VarType() никогда не возвращает значение 8192. Это связано с тем, что элементы массива содержат данные, которые также соответствуют одному из типов данных. Например, если элементами массива являются числа типа Integer, то функция будет возвращать значения 2 + 8192, т.е. 8194.
VBScript:
Dim Array(100)
T=""
T=VarType(Array)
MsgBox T
ASP, ASP.NET:
<%
Response.Write(VartType(Parametr))
%>
Приведенный пример возвращает значение 8204 = 8192 + 12. Элементы массива не определены, поэтому они имеют тип данных Variant (12).
Процесс автоматического преобразования типов данных называется динамическим связыванием (late binding). Избежать динамического связывания можно с помощью опции Striсt:
<%@ Striсt="True" %>
При включении опции Striсt автоматически включается Explicit. Кроме того, опцию Striсt можно включить для всех страниц ASP.NET в файле machine.config:
<Compilation>
Striсt = "True"
</Compilation>
В отличие от VBScript-сценариев и классических ASPстраниц в ASP.NET при передаче параметров подпрограммам или методам всегда должны использоваться скобки.
Например, приведенный ниже сценарий без ошибок будет выполняться под ASP:
<%
Response.Write "Привет"
%>
Но в ASP.NET он вызовет ошибку, поскольку метод Write необходимо использовать со скобками:
<%
Response.Write ("Привет")
%>
Операторы SET и LET
В VBScript и ASP для присвоения переменных необходимо было использовать переменную SET.
VBScript:
Set obj=CreateObject("Adodb.Connection")
ASP:
<%
Set obj=Server.CreateObject("Adodb.Connection")
%>
На страницах ASP.NET он больше не используется. Синтаксис присвоения переменной объекта выглядит следующим образом.
ASP.NET:
<%
obj=Server.CreateObject("Adodb.Connection")
%>
Также не поддерживается оператор LET.
Поддержка многопоточных компонентов
По умолчанию в ASP.NET не поддерживаются многопоточные методы, такие как ADO Connection, Scripting Dictionary. Для включения их поддержки в заголовке файла необходимо использовать директиву:
<%@ PageASPCompat="True" %>
Обработка ошибок в ASP.NET
Для обработки ошибок предназначен класс System.Exception. Анализируемый на ошибки код заключается внутрь конструкции Try:
Tru Code
<Sample Code>
Cath err as Exception
Response.write(err)
End Try
Для конкретизации ошибки рекомендуется использовать встроенные свойства (см. таблицу 5).
Таблица 5. Описания часто используемых параметров для обработки ошибки
Свойство
|
Описание
|
Err
|
Краткое описание ошибки
|
Err.Message
|
Полное описание ошибки
|
Err.GetType.ToString
|
Тип ошибки
|
Err.Source
|
Источник ошибки (имя библиотеки)
|
Вместо заключения
Рассмотрев основные этапы перехода с языка VBscript и ASP к ASP.NET, изучив различные подводные камни, вы можете приступить к изучению более сложных вещей, касающихся программирования на ASP.NET: управления файловой системой, Active Directory и т. д.