УДК 004.056
РАЗРАБОТКА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ ДЛЯ ПОЛУЧЕНИЯ ПОЛЬЗОВАТЕЛЬСКИХ ВЕБ-ЗАПРОСОВ
И.Э. Стрекалов, А.А. Новиков, Д.В. Лопатин
Тамбовский государственный университет имени Г.Р. Державина, Россия, г. Тамбов. е-mail: strekalov.ilya@gmail.com
В статье приведен анализ существующих наиболее распространенных методов получения пользовательских запросов. Рассмотрены основные способы получения запросов пользователей к веб-ресурсам, выделены их недостатки.
Ключевые слова: разработка, способ, перехват, пользователь, веб-запрос, java, nettyio.
Разрабатываемое программное обеспечение для получения пользовательских веб-запросов является частью будущей системы динамической фильтрации веб-контента, направленной на снижение информационных угроз для пользователя [1, 2]. Ранее нами были установлены необходимые требования к системе фильтрации веб-контента [3]. Основные требования следующие: необходимо учесть вероятную нагрузку на сервер системы фильтрации, обеспечить масштабируемость разрабатываемого программного продукта, изначально разрабатывать продукт, для которого в дальнейшем можно будет добавить дополнительные модули, например, обеспечивающие фильтрацию графического контента, обеспечить должную защиту от попыток обхода фильтра со стороны пользователя, последним и вероятно самым спорным из перечисленных выше требований является - кроссплатформенность разрабатываемого продукта.
На наш взгляд, кроссплатформенность позволит избежать время- и трудозатрат на разработку продукта под все существующие операционные системы, которые в значительной мере отличаются друг от друга. Кроссплатформенность также позволит уменьшить затраты на дальнейшую поддержку продукта, написание исправлений и выпуск обновленных версий программного обеспечения. Полноценной кроссплатфор-менности на данный момент добиться практически невозможно, поэтому вероятно придется прибегнуть к некоторым ограничениям в дальнейшем, но грамотный подход к разработке позволит нивелировать созданные ограничения удобством в использовании.
Существует несколько вариантов получения запросов пользователя в сеть Интернет для обработки ответов на данные запросы [46]. Среди них наиболее распространены варианты: 1) перехват API операционной системы; 2) создание собственного сетевого подключения для передачи запросов по нему; 3) настройка прокси-сервера.
Перехват API операционной системы не соответствует требованиям к разрабатываемому продукту, так как решение должно быть кроссплатформенным, а написание перехватчиков для существующих операционных систем требует больших время- и трудозатрат и создает проблему создания клиента системы динамической фильтрации контента. Однако подобный подход отвечает требованиям к безопасности, так как пользователь никак не влияет на «перехваты» и не может изменить их конфигурацию без внесения изменений в конфигурацию клиентской части программного обеспечения.
Создание собственного сетевого подключения по своей сути создаст те же проблемы, что и перехват API, за исключением того, что пользователь с правами администратора сможет перенастроить или вовсе отключить созданное сетевое подключение для обхода контентной фильтрации [7].
Третий и наиболее легкореализуемый способ - это создание на сервере фильтрации собственного прокси-сервера для перенаправления всех запросов пользователя к нему. Такой подход обеспечит наименьшие затраты на написание клиентского программного обеспечения и положительно скажется на изменении в будущем про-
граммного кода системы динамической фильтрации веб-контента.
Используемый прокси-сервер позволит также кешировать пользовательские запросы для обеспечения высокой скорости работы всей системы фильтрации. Однако необходимо учесть, что на сегодняшний день существуют технологии обновления некоторой части веб-страницы без повторного запроса полной страницы на удаленном вебсервере. Для того чтобы кеш страниц, использующих подобные технологии, обновлялся корректно, необходимо проверять полученный ответ от веб-сервера на предмет использования таких технологий. В случае если подобные технологии не используются, и содержимое страницы представляет из себя статический текст (например, статья в энциклопедии), то страницу можно добавить в кеш сервера, а если подобная технология используется (например, для реализации функции мгновенного обмена сообщениями), то все обращения к веб-сайту необходимо проводить без использования ке-ша [8].
Наиболее распространенной на сегодняшний день технологией асинхронной обработки веб-страниц с использованием JavaScript и XML, используемой для «фонового» обмена данными между клиентом и веб-сервером, является AJAX. Для определения присутствия технологии AJAX на вебстранице необходимо проверить является ли НТТР^)-запрос просто запросом веб-страницы или это «xmlhttprequest». В случае если запрос является «xmlhttprequest», то такие запросы нельзя кешировать, их необходимо обрабатывать каждый раз [9].
На данный момент в сети Интернет существует множество прокси-серверов, но все они так или иначе защищены авторскими правами и распространяются на основе различных лицензий, большинство из которых накладывают серьезные ограничения на коммерческие продукты. Поэтому система динамической фильтрации веб-контента нуждается в собственном решении, которое обеспечило бы работу с протоколами HTTP(S). Собственный прокси-сервер позволит не только избежать трудностей с лицензированием, но и облегчит установку системы фильтрации на серверное оборудование,
так как большинство прокси-серверов необходимо устанавливать отдельно и конфигурировать тоже отдельно [10].
Для написания небольшого многопоточного кроссплатформенного прокси-сервера отлично подойдет язык программирования Java с его встроенными библиотеками, обеспечивающими работу с сетью java.net.*, работу с потоками java.lang.Thread и вводом-выводом java.io.*. В дальнейшем для реализации сложного по своей структуре кеширую-щего веб-сервера возможно использование сторонней библиотеки языка Java - Netty IO. Библиотека Netty IO распространяется по лицензии Apache License 2.0 и является совершенно бесплатной, также разрешено использовать данную библиотеку в коммерческих продуктах. Стоит отметить, что благодаря использованию прокси-сервера переход на Netty IO можно совершить совершенно незаметно для конечного пользователя системы фильтрации.
В работе с HTTP-запросами также необходимо учесть тот факт, что в настоящий момент многие веб-сайты стараются использовать модифицированную версию протокола с шифрованным соединением - HTTPS. В этом случае снова возникает необходимость использовать библиотеку Netty IO, так как она полностью поддерживает SSL/TLS-соедине-ния благодаря классу io.netty.handler.ssl.
Прокси-сервер, по сути, это обычная программа, которая прослушивает определенный порт или несколько портов и производит некие действия, в зависимости от полученных команд. Например, если пользователь использует прокси-сервер для просмотра интернет-страниц, то браузер пользователя передает НТТР^)-запрос прокси-серверу, а прокси-сервер передает этот запрос в Интернет, получает ответ, изменяет его содержимое при необходимости и возвращает обратно браузеру пользователя.
Для прослушивания порта можно использовать стандартный класс JDK с названием ServerSocket. При инициализации, класс ServerSocket в качестве параметра принимает порт, который нужно прослушивать. В качества порта можно использовать любой свободный, например 10000. Основным условием является то, что порт не должен быть занят другой программой:
ServerSocket serverSocket = new ServerSocket( 10000).
Для того чтобы запустить процесс прослушивания, необходимо вызвать метод accept в условно бесконечном цикле while для непрерывного прослушивания, до принудительного выхода из тела цикла:
while (listening) { new
ProxyThread(serverSocket.accept()) .start(); // Создание экземпляра класса ProxyThread и
применение к нему метода start(). }
Start() для класса ProxyThread - позволяет запустить прослушивание в отдельном потоке выполнения.
Далее в ProxyThread необходимо создать логику работы прокси-сервера. Для начала необходимо получить все данные из сформированного ранее сокета для получения URL-адреса запроса. В первую очередь необходимо инициировать поток приема данных с помощью BufferedReader:
BufferedReader in = new BufferedReader (new InputStreamReader(socket.getInputStream())).
Затем необходимо получить URL-адрес, прочитав поток in построчно с помощью readLine до тех пор, пока поток не закончится:
while ((inputLine = in.readLine()) != null)
{
try {
if (cnt == 0) {
String[] tokens = inputLine.split(" "); // Разделение строки на подстроки - слова и помещение их в массив строк tokens.
urlToCall = tokens[1]; // Выбор второго элемента массива tokens хранящего
URL адрес веб-ресурса. }
cnt++; }
В итоге, после того как выполнится данная часть кода в переменной urlToCall, будет храниться веб-запрос к удаленному серверу, полученный от пользователя. Далее необходимо отправить полученный запрос на сервер назначения и получить ответ от вебсервера.
BufferedReader rd = null; try {
URL url = new URL(urlToCall);
URLConnection conn =
url.openConnection(); // Открытие подключения к заданному адресу urlToCall.
conn.setDolnput(true); // Передача запроса GET
conn.setDoOutput(false); // Отмена для запроса POST
InputStream is = null; HttpURLConnection huc = (HttpURLConnection)conn;
if (conn.getContentLength() > 0) { try {
is = conn.getInputStream(); rd = new BufferedReader(new In-putStreamReader(is)); // Передача URL подключения в поток чтения.
} catch (IOException ioe) {
System.out.println(ioe); }
}
Далее необходимо отправить полученные данные клиенту прокси-сервера. Для этого поток is (InputStream) необходимо будет разделить на равные по размеру блоки и отправить их клиенту в выходной поток out (DataOutputStream). Размер блоков в данном случае равен 32768 байт.
DataOutputStream out = new DataOutputStream(socket.getOutputStream()); byte by[] = new byte[32768]; int index = is.read( by, 0, 32768); while ( index != -1 ) {
out.write( by, 0, index ); // Последовательная запись в выходной поток блоков by.
index = is.read( by, 0, 32768); // Индексация блоков для последующей отправки. }
out.flush(); // По завершении передачи -очистка потока.
По завершении передачи необходимо закрыть все открытые ранее потоки с помощью метода close(), если они не были закрыты до этого, а также очистить сформированный сокет.
if (rd != null) { rd.close();} // Закрытие потока для чтения.
if (out != null) { out.close();} // Закрытие потока вывода.
if (in != null) { in.close();} // Закрытие потока ввода.
if (socket != null) { socket.close(); }// Закрытие созданного ранее сокета.
Необходимо отметить, что приведенный выше пример прокси-сервера лишь показывает насколько легко написать простой прокси-сервер на языке Java с использованием лишь стандартных средств разработки, включенных в пакет JDK. Приведенный пример прокси-сервера позволяет обрабатывать только HTTP-GET-запросы и не обрабатывает полученные результаты, а лишь отправляет их пользователю.
Проанализировав типовые методики получения пользовательских веб-запросов, было отмечено, что наиболее благоприятный способ для динамической фильтрации веб-контента - это создание и использование собственного прокси-сервера, который будет работать с протоколами HTTP и HTTPS. Помимо того, что прокси-сервер удовлетворяет большинству требований к разрабатываемому продукту, он также позволяет создать на его основе кешированную базу последних запросов. Кеширование позволит увеличить скорость работы системы динамической фильтрации при частом переходе по одним и тем же веб-сайтам. В анализе было учтено и то, что создание собственного прокси-сервера стандартными средствами разработки выбранного языка программирования Java является возможным, но не достаточным для обеспечения полного спектра возможностей и раскрытия всего потенциала использования кеширующего прокси-сервера.
Литература
1. Лопатин Д.В. Угрозы информационного характера в современной России // Актуальные проблемы информатики и информационных технологий: учебное пособие / под ред. М.С. Чвановой. Тамбов: Издательский дом ТГУ им. Г.Р. Державина, 2012. С. 100-122.
2. Лопатин Д.В., Анурьева М.С., Лопатина М.В., Заплатина Е.А., Калинина Ю.В., Еремина Е.А., Шевлягина М.А. Безопасность пользователей инфокоммуникационных технологий. Гуманитарный аспект // Вестник Тамбовского университета. Сер. : Естественные и технические науки. Тамбов, 2014. Т. 19. № 2. С. 652-655.
3. Стрекалов И.Э., Новиков А.А., Лопатин Д.В. Методы динамической фильтрации веб-контента // Вестник Тамбовского университета. Сер.: Естественные и технические науки. Тамбов, 2014. Т. 19. № 2. С. 668-669.
4. Реализация перехвата вызовов API [Электронный ресурс] // HabraHabr. URL: http://
habrahabr.ru/post/178393/. Дата обращения 07.06.2014.
5. Создание драйвера сетевого устройства. Часть 1 [Электронный ресурс] // NKLUG. URL: http://nklug.org.ua/lg/lg93/bhaskaran.html. Дата обращения 07.06.2014.
6. Настройка использования прокси-сервера для обозревателя Internet Explorer [Электронный ресурс] // Microsoft Поддержка. URL: http:// support.microsoft.com/kb/135982/ru. Дата обращения 07.06.2014.
7. To-do: Фильтруем вся и все [Электронный ресурс] II HabraHabr. URL: http://habrahabr.ru/ post/188444/. Дата обращения 07.06.2014.
8. Отт A. О контентной фильтрации II Jet Info. 2006. №10 (261) [Электронный ресурс]. URL: http://alexott.net/ru/writings/cf/JI200610.pdf. Дата обращения 07.06.2014.
9. Учебное пособие по кэшированию. Часть 1 [Электронный ресурс] II HabraHabr. URL: http://habrahabr.ru/post/203548/. Дата обращения 07.06.2014.
10. Учебное пособие по кэшированию. Часть 2 [Электронный ресурс] // HabraHabr URL: http://habrahabr.ru/post/204464/. Дата обращения 07.06.2014.
References
1. Lopatin D.V. Ugrozy informatsionnogo haraktera v sovremennoy Rossii // Aktual'nye problemy in-formatiki i informatsionnyh tehnologiy: ucheb-noe posobie / pod red. M.C. Chvanovoy. Tambov: Izdatel'skiy dom TGU im. G.R. Derzhavina, 2012. S. 100-122.
2. Lopatin D.V., Anur'eva M.S., Lopatina M.V., Zaplatina E.A., Kalinina Yu.V., Eremina E.A., Shevlyagina M.A. Bezopasnost' pol'zovateley infokommunikatsionnyh tehnologiy. Gumanitarnyj aspekt // Vestnik Tambovskogo universiteta. Ser.: Estestvennye i tehnicheskie nauki. Tambov, 2014. T. 19. № 2. S. 652-655.
3. Strekalov I.E., Novikov A.A., Lopatin D.V. Metody dinamicheskoy fil'tratsii veb-kontenta// Vestnik Tambovskogo universiteta. Ser.: Estestvennye i tehnicheskie nauki. Tambov, 2014.
T. 19, № 2. S. 668-669.
4. Realizatsiya perehvata vyzovov API [Elektronnyj resurs] // HabraHabr. URL: http://habrahabr.ru/ post/178393/. Data obrascheniya 07.06.2014.
5. Sozdanie drayvera setevogo ustroystva. Chast' 1 [Elektronnyj resurs] // NKLUG. URL: http:// nklug.org.ua/lg/lg93/bhaskaran.html. Data obrascheniya 07.06.2014.
6. Nastroyka ispol'zovaniya proksi-servera dlya obozrevatelya Internet Explorer [Elektronnyj resurs] // Microsoft Podderzhka. URL: http://
support.microsoft.com/kb/135982/ru. Data obrascheniya 07.06.2014.
7. To-do: Fil'truem vsya i vse [Elektronnyj resurs] // HabraHabr. URL: http://habrahabr.ru/post/188444/. Data obrascheniya 07.06.2014.
8. Ott A. O kontentnoy fil'tratsii // Jet Info. 2006. №10 (261) [Elektronnyj resurs]. URL: http:// alexott.net/ru/writings/cf/JI200610.pdf. Data obrascheniya 07.06.2014.
9. Uchebnoe posobie po keshirovaniyu. Chast' 1 [Elektronnyj resurs] // HabraHabr. URL: http:// habrahabr.ru/post/203548/. Data obrascheniya 07.06.2014.
10. Uchebnoe posobie po keshirovaniyu. Chast' 2 [Elektronnyj resurs] // HabraHabr. URL: http://
habrahabr.ru/post/204464/, svobodnyj. Data obrascheniya 07.06.2014.
SOFTWARE DEVELOPMENT FOR CUSTOM WEB SEARCHES
I.E. Strekalov, A.A. Novikov, D.V. Lopatin
Tambov State University named after G.R. Derzhavin Tambov, Russia. e-mail: strekalov.ilya@gmail.com
This paper provides analysis of the most common methods of obtaining user queries. The main ways of getting user requests to web resources, highlighted their shortcomings.
Key words: development, method interception, user, web request, java, nettyio.
УДК 519.240
ИСПОЛЬЗОВАНИЕ ПЛП-ПОИСКА В ЗАДАЧАХ ОБРАБОТКИ РЕЗУЛЬТАТОВ ВЫЧИСЛИТЕЛЬНОГО ЭКСПЕРИМЕНТА
И.Н. Статников, Г.И. Фирсов
Институт машиноведения им. А.А. Благонравова РАН, Россия, г. Москва e-mail: firsovgi@mail.ru
В статье рассматривается возможность на основе планируемого вычислительного эксперимента на стадии математического моделирования эффективно строить свертки получаемой информации. Это позволяет строить непосредственную функциональную зависимость между параметрами и критериями качества динамической системы.
Ключевые слова: планирование вычислительных экспериментов, ЛП-сетки, имитационное моделирование, регрессионный анализ.
Проведение математических экспериментов, т.е. математическое моделирование, должно быть целенаправленным и оптимальным (хотя бы в смысле затрат машинного времени, что далеко не всегда является главным). Специфика различных областей научных исследований привела к разработке множества методов и их модификаций планирования экстремальных экспериментов. При исследовании машин и механизмов специфика этой области научного знания может быть обрисована следующим образом. Физические принципы и законы классической механики позволяют в большинстве случаев строить математические модели функционирования современных проектируемых технических систем. Такие модели представляют собой совокупность обыкновенных дифференциальных (линейных или нелинейных) уравнений, дифференциальных уравнений в частных производных, интегральных, интегро-диффе-
ренциальных уравнений и различных функциональных ограничений. Наличие таких (имитационных) моделей и современной вычислительной техники позволяет уже на предварительной стадии исследования изучить особенности функционирования, т.е. динамические свойства проектируемого устройства.
С учетом рассмотренной специфики исследования задач механики машин авторами был предложен метод ПЛП-поиска (планируемого ЛП-поиска) [1-3], позволяющий, с одной стороны, на основе проведения вычислительных экспериментов осуществить квазиравномерный просмотр области исследуемых параметров О (а), а с другой стороны, в результате специального планирования этих экспериментов применить количественные оценки влияния варьируемых параметров а}- на анализируемые свойства машины (оценки, разработанные в математической статистике).