**

Устойчивые системы

Устойчивые системы


Определение.
Устойчивая система — система документировано реагирующая на любое изменение внешних условий.

Как оказалось, ключом к написанию безопасных Web-приложеннй является это определение, "открытое" еще на младших курсах института. Система может прекрасно работать в нормальных условиях функционирования. Сообщения могут добавляться в форум, поиск — работать по всем новостям в базе данных и т. п. Более того, система может даже пройти все тесты на работоспособность в нормальных условиях. В условиях, когда пользователь не вмешивается во взаимодействие между браузером и сервером, т. е. его взаимодействие ограничивается переходами по ссылкам, отправлением форм, содержащих адекватные данные, и т. п. И при таких условиях система может нормально и адекватно работать.

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

Логически верные HTTP-запросы, которые могут быть объяснены здравым смыслом. Например, в качестве целочисленного идентификатора логично вставить число О, I, 99 и т. п. А в качестве запроса на поиск в базе данных имен корректно с точки зрения логики вписать слова, содержащие буквы русского или английского алфавита. Например "иван", "петров" и т. п.

Определение.
HTTP-запрос — набор данных, посылаемых клиентом на Web-сервер согласно протоколу HTTP. Данные содержат адрес запрашиваемого скрипта, имя сервера, а также, возможно, GET, POST И cookie-параметры. Кроме того, в качестве полей заголовка клиентом могут быть отправлены некоторые второстепенные данные.

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

Скрипт HTTP://localhost/book/l/l.php выводит имя человека из тестовой базы данных, соответствующего некоторому идентификатору. Идентификатор передается в качестве GET-параметра с именем id.

Как видим, система нормально реагирует на правильные значения идентификатора:

- HTTP://locaIhost/book/1/1.php?id= 1
- HTTP://locaIhost/book/1/1.php?id=2
- HTTP://localhost/book/1/1,php?id= 100

Таким образом, можно сделать вывод, что система правильно работает. Правильно работает в том смысле, что на корректные запросы система выдаст корректные ответы.

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

Таким образом, реализован простой механизм получения информации из простой базы данных, из таблицы с двумя полями: целое число id — идентификатор человека и строка name — имя человека.

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

Пробуем HTTP://locaIhost/l/l.php?id=a, как мы видим, выводится ошибка:
Warning: mysql_fetch_object(): supplied argument is not a valid MySQL re-sult resource in x:\localhostM\l.php on line 15 записи не найдены
Что она означает и что может дать нападающему, как стоит защищаться от подобных ошибок, будет описано в следующих главах.
Вывод системной ошибки позволяет судить о том, что система некорректно реагирует на идентификатор, не являющийся целым числом.

Приведем еще один пример.
Скрипт HTTP://localhost/l/2.php делает то же самое, но только имя человека ищется не в базе данных, а в файле. При этом имя файла составлено из идентификатора и расширения txt.Протестируем этот скрипт.

Делаем следующие запросы:

- HTTP://localhost/l/2.php?id=l
- HTTP://localhost/l/2.php?id=2
- HTTP://locaIhost/l/2.php?id=3

Видим, что скрипт нормально реагирует на нормальные ситуации, когда запрошен идентификатор человека, файл которого присутствует на диске.
Проверим, как ведет себя система в экстремальных ситуациях:

- HTTP://localhost/l/2.php?id=9999
- HTTP://localhost/l/2.php?id=a

В этих примерах можем видеть, что подобные запросы вызывают примерно следующие ошибки:
Warning: fopen(data/5.txt): failed to open stream: No such file or direc-tory in x:\localhost\l\2.php on line 12
Warning: freadO: supplied argument is not a valid stream resource in x:\localhost\l\2.php on line 13
Warning: fclose(): supplied argument is not a valid stream resource in x:\localhost\l\2.php on line 15
Мы видим, что если идентификатор не представляет собой целое число, или даже если данному идентификатору не соответствует ни одна запись, система реагирует некорректно.

Что может дать нападающему информация, содержащаяся в тексте ошибок, будет описано в дальнейшем.
Оба приведенных примера являются примерами неустойчивой системы. Поведение скриптов предсказуемо и объяснимо, если заглянуть в текст скриптов, однако совершенно очевидно, что данное поведение не может являться документированной реакцией.
Документированной реакцией в данном случае может быть вывод скриптом сообщения об ошибке, но не сообщение интерпретатора, что в скрипте встретилась ошибка.

Множество таких примеров можно встретить и в реальной жизни. Такова особенность человеческой психики — уделять максимум внимания работе системы при нормальных внешних условиях, и почти не обращать внимания на то, что внешние условия могут быть не совсем такими или совсем не такими, как подсказывает логика.

Ключевым понятием к написанию устойчивых систем является фильтрация.



Советуем прочитать:

Добавить

Комментарии

Последние новости

Голосование

Какие услуги вам нужны?

Ремонт компьютера
Установка ОС
Купить диски
Лицензионное по
Другие услуги
Результаты

Поиск по сайту

Компьютерная помощь XPmaster онлайн