Безопасность активного содержимого
Отладка активного содержимого
При поиске в интернете встречаются ссылки на страницы, сгенерированные поисковой системой, которые вызывают ошибку времени выполнения сценария. Причина ошибки заключается в некоторых сведениях, нередко содержащих используемую сценарием информацию, например, данные о структуре бизнеса или расположении базы данных. Это значит, что страница со сценарием не была достаточно протестирована перед публикацией в интернете. Если сценарии, генерирующие ошибки, публикуются в интернете не полностью отлаженными, основные поисковые системы смогут выводить о них некоторые данные.
Например, при поиске в системе Altavista (http://www.altavista.com) по строке "Microsoft VBScript runtime error + .inc" появятся сотни результатов поиска, и во многих будет указан полный путь и имя файла вставки (.inc). Если присоединить это имя к имени узла и вызвать страницу по получившемуся адресу в веб-браузере, то велика вероятность того, что отобразится содержимое файла вставки.
Подобная утечка информации о системе чрезвычайно полезна для хакера при планировании атаки на сервер. Мы уже говорили о важности связывания файлов вставок с ASP, однако следует убедиться в том, что веб-разработчики качественно отлаживают все страницы со сценариями в автономном режиме перед их публикацией на действующем сервере. Следует также выполнять поиск в интернете собственных страниц для определения корректности их отладки, после чего удалять или переименовывать их в случае ошибок.
Перехват ошибок
Обычно веб-разработчики ограничены во времени и, как правило, ставят на первое место внешний вид, удобство работы и функциональность, а о безопасности думают далеко не в первую, если не в последнюю, очередь. В "Сторонние средства обеспечения безопасности" говорилось о том, что такой подход недопустим при разработке содержимого для интернета. Разработка и тестирование должны проводиться в автономном режиме для успешного устранения всех угроз безопасности создаваемых сценариев, а это возможно при таком выполнении сценария, когда семантические ошибки программирования выявляются сами по себе.
Синтаксические ошибки находить легко, так как программный компилятор или интерпретатор прерывает выполнение кода и обозначает строку с синтаксической ошибкой. Плохо обученный разработчик исправит свои синтаксические ошибки, после чего отгрузит новый код, уверенный в отсутствии ошибок. Однако семантические ошибки или ошибки времени выполнения могут возникнуть во время непосредственного выполнения программы, что позволяет выявить исходный код любым пользователем, запустившим сценарий. Например, при добавлении шестого товара в корзину покупок электронного магазина произойдет семантическая ошибка, если максимальное число товаров для покупки, установленное в программе, равно пяти.
Необходимо, чтобы код разрабатывался программистами с учетом аспектов безопасности. При написании безопасных программ следует проверять наличие файла перед его открытием, а также правильность вводимых значений. Код должен тестироваться посредством ввода различных значений, среди которых есть корректные значения, значения, являющиеся пограничными (т.е. находящиеся на границе между допустимыми и недопустимыми значениями), а также некорректные значения. Такое тестирование предотвратит большую часть ошибок, возникающих из-за вводимых пользователем данных.
Поскольку идеально написанного кода не существует, необходимо обеспечить поддержку активным содержимым непредвиденных ошибок и отображение соответствующих уведомлений об их возникновении. По умолчанию файл 500-100.asp обрабатывает все ошибки, возникающие при компиляции или запуске файлов .asp. При возникновении ошибки ASP IIS возвращает файл 500-100.asp с информацией о ней, например, номер строки, в которой произошла ошибка, и ее описание.
Следующий код VBScript фиксирует любые возникающие ASP-ошибки в файле журнала, а также выводит сообщение для пользователя. Эти действия предотвращают отображение исходного кода страницы, вызвавшей ошибку. Этот код можно модифицировать на передачу информации об ошибке по электронной почте веб-мастеру.
<%LANGUAGE="VBSCRIPT" %> <% Option Explicit %> <% ' Предотвратить прерывание выполнения данной страницы дальнейшими ошибками On Error Resume Next Dim objASPError 'Объект ошибки Dim strErrNumber, strASPCode Dim strErrDes, strASPDes Dim strCategory, strFileName Dim strLineNumber, strColNumber Dim strSourceCode, strErrorMsg Dim strErrorLog, strReferrer 'Строки Dim lngColNum 'Длина Dim objFSO 'Объект файла Dim objTStream DimblnLogFail 'Boolean 'Установка ссылки на объект ASPError Set objASPError = Server.GetLastError() ‘Сохранение значений свойств объекта ASPError strErrNumber = CStr(objASPError.Number) 'Код обычной ошибки strASPCode = objASPError.ASPCode 'Код ошибки ASP If Len(strASPCode) Then strASPCode = "'" & strASPCode & "'" Else strASPCode = "" End If strErrDes = objASPError.Description strAspDes = objASPError.ASPDescription strCategory = objASPError.Category 'Тип ошибки strFileNAme = objASPError File 'Файл, вызвавший ошибку strLineNumber = objASPError.Line 'Номер строки в файле strColNumber = objASPError.Column 'Номер столбца в строке If IsNumeric(strColNumber) Then 'Преобразовать в целое число lngColNumber = CLng(strColNumber) Else lngColNumber = 0 End If strSourceCode = objASPError.Source 'Исходный код строки с ошибкой 'Создание сообщения об ошибке strErrorMsg = "ASP Error " & strASPCode & "occurred on " & Now If Len(strCategory) Then strErrorMsg = strErrorMsg & " in " & strCategory End If strErrorMsg = strErrorMsg & vbCrlf & "Error number: " & strErrNumber _ & " (0x" & Hex(strErrNumber) & ")" & vbCrlf If Len(strFileName) Then strErrorMsg = strErrorMsg & "File: " & strFileName If strLineNumber > "0" Then strErrorMsg = strErrorMsg & ", Line " & strLineNumber If lngColNumber > 0 Then strErrorMsg = strErrorMsg & ", Column " & lngColNumber If Len(strSourceCode) Then strErrorMsg = strErrorMsg & vbCrlf & strSourceCode & vbCrlf _ &String(lngColNumber – 1, "-") & "^" End If End If End If strErrorMsg = strErrorMsg & vbCrlf End If strErrorMsg = strErrorMsg & strErrDes & vbCrlf If Len(strAspDes) Then strErrorMsg = strErrorMsg & "ASP reports: " & strAspDes & vbCrlf End If 'Зафиксировать ошибку в файле журнала. 'Изменить путь к файлу журнала для конкретной системы. 'Нужно присвоить учетной записи IUSR_имя-компьютера разрешение на 'запись и изменение файла. strErrorLog = "D:\temp\custom_error.log" set objFSO = Server.CreateObject("Scripting.FileSystemObject") Set objTStream = objFSO.OpenTextFile(strErrorLog, 8, True) '8 = ForAppending If Err.Number = 0 Then objTStream.WriteLine strErrorMsg & vbCrlf End If If Err.Number = 0 Then objTStream.Close blnLogFail = False Else blnLogFail = True End If 'Вывод сообщения в веб-браузере. %> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <HTML> <HEAD> <TITLE>Error</TITLE> </HEAD> <P>К сожалению, запрошенная вами страница содержит ошибку и не может быть отображена.</P> <% 'Добавить ссылки для возврата на предыдущую или домашнюю страницу. strReferrer = Request.ServerVariables("HTTP_REFERER") If Len(strReferrer) Then Response.Write "<p><A HREF=""javascript:history.go(-1)"">Вернуться на предыдущую страницу</A></P> End IF Response.Write "<P>Возврат на <A HREF=""http://www.ваш_домен.com""> домашнюю страницу</A></P> %> </P> <P>Пожалуйста, обратитесь к <A HREF="mailto:webmaster@ваш_домен.com">веб-мастеру</A> для выяснения причин возникновения данной проблемы</P> </BODY> </HTML>Листинг 11.1.
Обработка ошибок устанавливается на главном уровне, веб-уровне или уровне каталога посредством изменения свойств сообщений об ошибках HTTP, передаваемых клиентам при их возникновении.
Для настройки IIS на отображение сообщения об ошибке откройте консоль Internet Services Manager (Диспетчер служб интернета) и щелкните правой кнопкой мыши на нужном сервере или веб-сайте. Выберите команду Properties (Свойства), откройте вкладку Custom Errors (Другие ошибки) и прокрутите вниз список сообщений об ошибках, чтобы отобразить HTTP Error 500;100 (см. рис. 11.11).
Нажмите на кнопку Edit Properties (Изменить параметры) для изменения параметров сообщения об ошибке, указав созданную или измененную страницу с текстом уведомления (см. рис. 11.12).
Совет. Убедитесь, что файл обработки ошибок не содержит синтаксических ошибок или ошибок времени выполнения; если в коде присутствуют ошибки, они отобразятся в веб-браузере. Строка 5 приведенного выше кода On Error Resume Next обеспечивает выполнение файла без возникновения ошибок.
Рис. 11.11. Измененные страницы с информацией об ошибках предоставляют вам и вашим пользователям полезные данные
Рис. 11.12. Если типом выводимых данных является URL, то этот URL должен существовать на локальном сервере
Ошибки ASP и журнал событий Windows
Ошибки ASP можно передавать в журнал событий Windows, если указаны соответствующие параметры в окне Process Options Properties (Свойства обработки). Для настройки этих параметров откройте окно WWW Service Master Properties (Главные свойства службы WWW), щелкнув правой кнопкой мыши на сервере в Internet Services Manager (Диспетчер служб интернета). Откройте вкладку Home Directory (Домашний каталог), после чего нажмите на кнопку Configuration (Настройка). Откроется окно Application Configuration Properties (Настройка конфигурации приложения). Откройте вкладку Process Options (Обработки опций) (см. рис. 11.13).
Рис. 11.13. Параметры конфигурации приложения устанавливаются на уровне веб-сайта и виртуального каталога, а опции обработки – только на главном уровне
Отметьте опцию Write Unsuccessful Client Requests To Event Log (Заносить неудачные запросы клиентов в журнал событий), и наиболее серьезные ошибки ASP будут фиксироваться в журнале событий Windows.
Опция Enable Debug Exception Catching (Включить перехват исключений при отладке) отмечается только при отладке, так как она фиксирует любые сообщения об ошибках, поступающие от компонента. Так как отладка должна осуществляться только на сервере разработки, убедитесь, что данная опция отключена.
ПРОБЛЕМА
Иван, молодой разработчик, работающий над новым сайтом электронной коммерции, создает сценарии ASP для подключения веб-сайта к базе данных Microsoft SQL Server, содержащей информацию о клиентах, т.е. их имена, адреса, заказы и т.д. В понедельник утром Иван заявляет, что немедленно увольняется из компании и начинает новую карьеру. Время, отведенное на разработку сайта, неумолимо истекает, поэтому необходимо привлечь на место Ивана другого сотрудника. Вас устраивало качество выполнения Иваном своей работы, однако нужно удостовериться в том, что ее можно использовать.
Первым делом запретите Ивану доступ к файлам ASP и всей сети организации. Проинформируйте сетевого администратора о том, что учетная запись Windows, принадлежащая Ивану, должна быть удалена. Это запретит бывшему сотруднику доступ к сети. В дополнение к этому все члены команды разработки должны сменить свои пароли при следующем входе в систему. Это мера предосторожности необходима на тот случай, если Иван знает пароли других разработчиков компании.
Так как Иван имел доступ к базе данных SQL Server, он знает имя пользователя и пароль доступа, используемый страницами ASP для открытия соединения. У него могла быть и своя собственная учетная запись SQL Server с повышенными привилегиями, позволявшими ему проводить работу по разработке. Проинформируйте администратора базы данных о том, что учетная запись Ивана в базе данных должна быть удалена, а также об изменении пароля, используемого страницами ASP. Кроме этого, необходимо сменить остальные системные пароли, которые мог знать Иван.
Следующая задача состоит в том, чтобы провести обзор всей выполненной Иваном работы. Несмотря на то, что написанный им код хорошо закомментирован, нужно просмотреть каждую строку и выяснить следующее.
- Каждая страница содержит в начале строку, устанавливающую кодировку.
- Все данные, вводимые пользователем в формы, или данные из элементов cookie проверяются на наличие запрещенных символов.
- Все данные, получаемые из базы данных для отображения на веб-странице, подвергаются кодировке.
- В коде отсутствует опасный или вредоносный код, например, ненужный вызов почтового сервера.
- В коде не используются системные пароли, доступ к ним осуществляется с помощью компонента COM+.
- Все вызовы базы данных выполняются посредством сохраненных процедур.
После того как код Ивана пройдет эту проверку, протестируйте его на сервере разработки для выявления синтаксических или семантических ошибок. Проверка должна включать в себя передачу данных сценариям (не только корректных значений, но и величин, превышающих максимально допустимые значения или соответствующих граничным условиям). Например, проверьте, каким образом осуществляется поддержка заказа на сумму, равную точно $500, если максимально разрешенной суммой покупки является $500.
Хотя Иван мог и вовсе не включать в код ненужные или вредоносные фрагменты, процедура проверки необходима, так как Иван осуществлял активный доступ к вашей сети и ее ресурсам.