Russian Qt Forum

Qt => Qt Script, QtWebKit => Тема начата: Den от Июнь 27, 2012, 15:47



Название: Захват данных при загрузке дочерних фреймов
Отправлено: Den от Июнь 27, 2012, 15:47
Здравствуйте

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

Код:
QFileInfo info(QApplication::applicationFilePath());
//Путь к файлу
   QString htmlFile = info.dir().filePath("frame.htm");
//Массив в котором будет хранится содержимое файла
    QByteArray data;
//Класс отвечающий за дешифрацию
    Kripto kript;
//Считываем их файла зашифрованные данные, дешифруем и помещаем в data
    data=kript.start(htmlFile);
//(WebV наследник QWebView) загружаем дешифрованные данные в QWebView
    WebV->setHtml(data,QUrl::fromLocalFile(htmlFile));
//Все нормально показывает
    WebV->show();

Проблема заключается в том, что если html файл содержит в себе фреймы <frame> то сам он дешифруется нормально, а вот файлы которые выводятся в фреймах не дешифруются.

Приведу пример:

Есть html с таки кодом

Код:
<html>
    <head>
        <title>Фреймы в html</title>
    </head>
    <frameset rows="50%, 50%" >
        <frame src="1.htm">
        <frame src="2.htm">
    </frameset>
</html>

При срабатывании программы получаем следующее

(http://s018.radikal.ru/i520/1206/e6/b85816a44bc2.jpg)

Как мы видим основная страница выглядит нормально, а вот те две которые подгружаются в нее не дешифрованы.

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


Название: Re: Захват данных при загрузке дочерних фреймов
Отправлено: Bepec от Июнь 27, 2012, 15:52
К сожалению не вижу расшифрованной части :)

А в чём проблема фреймы напрямую загрузить?


Название: Re: Захват данных при загрузке дочерних фрей
Отправлено: mutineer от Июнь 27, 2012, 16:04
Покопай в сторону класса QWebFrame
Кроме того посмотри на
Код:
void QWebPage::frameCreated ( QWebFrame * frame ) [signal]


Название: Re: Захват данных при загрузке дочерних фреймов
Отправлено: Den от Июнь 27, 2012, 16:09
1) Расшифрован основной фрейм, именно благодаря этому мы можем видеть два дочерних фрейма, ели бы он был не расшифрован, все окно представляло бы собой набор таких символов. Мешает то что нужен  механизм, ибо страниц тысячи и  появляются новые и комбинации фреймов в них самые разные, там и тект и рисунки и таблицы и т.д.

2) Это как бы очевидно, я уже по уши в QWebFrame закопался пока выхода не вижу.


Название: Re: Захват данных при загрузке дочерних фреймов
Отправлено: mutineer от Июнь 27, 2012, 16:11
2) Это как бы очевидно, я уже по уши в QWebFrame закопался пока выхода не вижу.

Откуда это очевидно?


Название: Re: Захват данных при загрузке дочерних фреймов
Отправлено: Den от Июнь 27, 2012, 16:35
Ну я сразу начал разбираться в структуре QWebKit и QWebFrame  показался мне наиболее перспективным классом, хотя решение может быть и не в нем.  :)

frameCreated интересная идея, только что-то не приходит сигнал


Название: Re: Захват данных при загрузке дочерних фреймов
Отправлено: Bepec от Июнь 27, 2012, 16:48
А можно у вас спросить примерчик html ки с алгоритмиков дешифровки? :)



Название: Re: Захват данных при загрузке дочерних фреймов
Отправлено: Den от Июнь 28, 2012, 09:49
Класс шифровки дешифровки реализовывал не я поэтому извините. Html файл я привел, или какой вам?

Так что, есть идеи?


Название: Re: Захват данных при загрузке дочерних фреймов
Отправлено: Bepec от Июнь 28, 2012, 10:51
Я бы упростил задачу % на 350. :)

Берёте ссылку на этот html, тупо его читаете. Расшифровываете. Находите там ссылки на фреймы. Читаете, расшифровываете. Находите там ссылки и прочая прочая прочая в цикле.
А потом просто создаёте расшифрованную копию с нужной структурой и усё.

В чём проблема? :)

PS и класс расшифровщика у вас видимо подточен на работу с 1 страницей. Так и используйте его. Последовательная расшифровка и никакого волшебства.

PPS *зануда ON* В результате у вас будет темповый расшифрованный результат, который можно открыть в любом браузере(в том числе и вебвьев).*зануда OFF*


Название: Re: Захват данных при загрузке дочерних фреймов
Отправлено: Den от Июнь 28, 2012, 11:42
Такая идея приходила мне в голову, я просто испытываю сомнения, правильно ли так делать? Опыт мне подсказывает что есть место где происходит собственно считывание данных по ссылкам и загрузка считанных тегов в фреймы, если его найти и вставить туда дешифратор то будет элегантное решение, его то я и ищу. Но, конечно, если не найду придется сделать так как вы предложили.


Название: Re: Захват данных при загрузке дочерних фреймов
Отправлено: Bepec от Июнь 28, 2012, 12:02
Я вам больше скажу - это место вы не сможете использовать. Это приватные вроде бы методы.
И в webView в page() mainFrame() и других frame вы найдете уже "скомпилированный" код html ки.

Я думаю, так даже правильнее делать. QWebView  в вашем случае ммм... избыточен. Ведь задача - расшифровать. А показывать можно и потом.


Название: Re: Захват данных при загрузке дочерних фреймов
Отправлено: Den от Июнь 28, 2012, 14:55
Возник еще такой вопрос, некоторые страницы содержат картинки, картинки эти также зашифрованы, где тот механизм который загружает картинку на страницу по тегу <img>?


Название: Re: Захват данных при загрузке дочерних фреймов
Отправлено: Bepec от Июнь 28, 2012, 15:04
Недра FrameLoader'а хранят в себе эту тайну.


Название: Re: Захват данных при загрузке дочерних фреймов
Отправлено: Den от Июнь 28, 2012, 15:06
Это да, я весь его отDebugил, я так понимаю вмешиваться в работу FrameLoadera не рекомендуется?


Название: Re: Захват данных при загрузке дочерних фреймов
Отправлено: Bepec от Июнь 28, 2012, 15:12
Он жеж вроде приватный. Я бы не советовал - слишком ... слишком многое можешь порушить :D



Название: Re: Захват данных при загрузке дочерних фреймов
Отправлено: Den от Июнь 28, 2012, 15:31
Я понял смысл Вашего решения, и оно мне нравится, но практическая реализация мне несколько непонятна.

Цитировать
Берёте ссылку на этот html, тупо его читаете. Расшифровываете. Находите там ссылки на фреймы. Читаете, расшифровываете. Находите там ссылки и прочая прочая прочая в цикле.
А потом просто создаёте расшифрованную копию с нужной структурой и усё.

Я могу последовательно расшифровать эти страницы, в примере который я привел в начале темы это получится 3 страницы, конкретно 3 объекта QByteArray, скажем DataFrame, Data1 и Data2, и что мне с ними затем делать? Способов загрузки вроде 2, или Url  или сами теги, но в любом случае откуда программа поймет что когда она наткнётся на "1.html" в DataFrame ей надо будет в этот фрейм грузить содержимое Data1?


Название: Re: Захват данных при загрузке дочерних фреймов
Отправлено: Bepec от Июнь 28, 2012, 15:39
Ну суть простая.

Структуру в темповом каталоге создайте.

Т.е. берёте index.html. Расшифровываете. в каталоге TempName создаёте index.html с расшифрованным содержимом. Далее берёте значения фреймов. И по очереди, расшифровывая, воссоздаёте структуру страницы.

Т.е. в вашем примере у вас получится
Код:
TempName/
                        index.html
                        1.htm
                        2.htm
И при запуске index у вас откроется расшифрованная страница с расшифрованными фреймами.

PS проще выражаясь - вы расшифровываете данные, при этом сохраняется структура документа. А далее грузите index в QWebView и он сам загрузит всё что вам надо.


Название: Re: Захват данных при загрузке дочерних фреймов
Отправлено: Den от Июнь 28, 2012, 19:00
Я думал вы имеете в виду что можно как-то загрузить структуру из памяти. Создать временные дешифрованные файлы, и подгружать их это очевидное решение, но неприемлимое, зачем шифровать файлы если сохранять на диске (пусть и временно) их дешифрованные копии.


Название: Re: Захват данных при загрузке дочерних фреймов
Отправлено: Bepec от Июнь 28, 2012, 19:12
Den, возможно это для вас новость, но на машине, которая дешифрует, эти данные УЖЕ ДОСТУПНЫ. Они расшифрованы, пусть и находятся в памяти. И то, что они в памяти, не убережёт вас от более-менее умелых людей.

Хотя не спорю - если забацаете систему тотального контроля за системой, тогда мб, мб сумеете % на 70 защитить их :)

Если доходить до параноидального сумасшедствия - тогда проще сканить систему и вырубать всё, что непричастно к жизнеобеспечению программы :D

Шифровать надо для того, чтобы на промежуточных компах не открыли. А при попадании в программу-дешифратор данные утекают сквозь пальцы :D

PS Где то тут поднималась тема, как открыть файл, находящийся в памяти. Но она будет для вас бесполезна - у вас целая иерархическая структура будет :D

PPS можете забацать вообще собственный браузер с блекджеком и шл... и подгрузкой файлов из памяти (но это бессмысленно и оОООООчень затратно будет).

PPPS вы там того, спросите - мб проще по https работать и шифровать не придётся? :) Иль системы аля Tor.


Название: Re: Захват данных при загрузке дочерних фрей
Отправлено: Den от Июнь 29, 2012, 09:14
Как будто я эти требования придумал, было сказано чётко, никакого сохранения на диске, поэтому у меня и возникли вопросы. А всё что вы пишете это понятно. 


Название: Re: Захват данных при загрузке дочерних фреймов
Отправлено: Bepec от Июнь 29, 2012, 09:19
А я лично не видел вашего требования в теме, не? :)

Ну что сказать: берёте QNetworkAccess, там напрямую расшифровываете, но всёравно помоему у вас немного ...
Тупые условия? Тот же QWebView помойму сохраняет на диске. Да и не найти вроде ни одного браузера, который будет всё в памяти держать.
Да и любая инфа, приходящая к вам уже на диске.