Вирусы с облака мейла

Обновлено: 18.04.2024


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

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

В конце статьи есть UPD, UPD2, UPD3 и UPD4, в котором описаны причины такого поведения.
TL;DR: ложная тревога, с файлами и синхронизацией всё в порядке, а вот пользовательский интерфейс и работу тех. поддержки нужно дорабатывать.

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


Остаётся только возможность скачать файлы через веб-интерфейс. Файлы там можно скачивать по одному, а можно выбрать несколько файлов или папок и скачать их одним архивом, что довольно удобно. Единственное ограничение — архив не может превышать 4Гб.


Я попробовал пойти этим путём, но быстро понял, что это очень неудобный вариант:

  • Ограничение в 4 гигабайта означает, что если у вас в облаке находится около терабайта, придётся качать как минимум 250 архивов.
  • Каждый архив нужно создавать вручную, выбирая папки, считая их суммарный размер и помечая те, что уже скачаны.
  • Иногда архивы не открываются по неизвестной причине.
  • Теряется структура папок.

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

Поэтому, у меня появилось два возможных варианта решения: подключить
Selenium и всё-таки строить дерево из html или разобраться с внутренним API, которое используется в скрипте.

Я выбрал второй путь, как самый разумный — зачем что-то парсить с использованием сторонних инструментов, если уже есть готовое API?
К счастью, скрипт не был обфусцирован и даже не сжат — мне были доступны исходные имена переменных и функций и комментарии разработчиков, это сильно облегчило задачу.

После нескольких минут изучения я увидел, что все доступные методы API описаны в массиве:



Вот поэтому я и не трачу в своём коде времени на красивое форматирование — кто-нибудь его обязательно поломает.

Открываем страницу в браузере и видим такой ответ:


Очевидно, нужно авторизоваться на портале. Авторизуюсь, повторяю запрос и вижу другую ошибку:


Ничего удивительного, для выполнения запросов к API требуется токен. В списке методов есть два подходящих: tokens/csrf и tokens/download .

Запрашиваем его, добавляем в вызов метода folder параметр ?token=X9ccJNwYeowQTakZC1yGHsWzb7q6bTpP и получаем новую ошибку:


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


Информация о файлах и директориях — то, что нужно!

Работоспособность API подтверждена, схема его работы понятная — можно приступать к написанию программы. Я решил писать консольное приложение на php, поскольку хорошо знаю этот язык. Для этой задачи идеально подходит компонент Console из состава Symfony. Я уже писал консольные команды для Laravel, которые построены как раз на этом компоненте, но там уровень абстракции довольно высок и напрямую с ним я не работал, поэтому решил, что настало время познакомиться поближе.

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



Так выглядит приложение в процессе скачивания файлов.



А вот так по завершении: показывается небольшая табличка (максимум 100 строк) с информацией о скачаных файлах. Никакой практической пользы она не несёт и сделана исключительно в образовательных целях.

В состав консольного приложения может входить несколько команд, вызываемых следующим образом: php app.php command argument --option . Но для моих целей нужна всего одна команда и я хотел бы запускать скачивание так: php app.php argument --option . Этого легко добиться при помощи инструкции из документации компонента.

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

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

Проверка простая настолько, что сейчас она проваливается если в почтовом ящике есть непрочитанные письма — их количество выводится в заголовке страницы. Но я ящиком не пользуюсь, поэтому для моих целей этого достаточно.

Далее я попробовал запросить csrf-токен, но с удивлением получил уже знакомую ошибку:


Я занялся отладкой запросов и увидел, что авторизация происходит успешно, но, тем не менее, токен мне не отдавался. Очень похоже на проблему с куками и действительно, оказывается, в Guzzle они по-умолчанию выключены и их нужно включать руками.

Проще всего это сделать один раз при инициализации клиента:


Ещё одним параметром инициализации является 'debug' => true, с ним отладка запросов почти безболезненна.

Настроив куки, я снова попробовал получить токен и получил в ответ ошибку авторизации, с которой до этого не сталкивался:

Я добавил этот запрос после запроса авторизации и наконец-то смог получить токен. Ну а дальше дело техники — запрашивать содержимое корневой папки и рекурсивно содержимое её подпапок, и дерево готово.

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

Учитывая, что адреса шардов отличаются только цифрой, думаю, можно было бы не заморачиваться и захардкодить адрес, но если уж делать, то делать до конца!


Нас интересует массив, хранящийся в get.

Выбираем случайный элемент из массива шардов, добавляем к нему адрес файла и ссылка для скачивания готова!
Для экономии памяти можно сразу при создании запроса указать, куда Guzzle должен записать ответ, для этого используется параметр sink.

Итоговый код выложен на GitHub под лицензией MIT, буду рад, если он кому-то пригодится.

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

* Все, которые не успело сначала удалить.

UPD: Общение с тех. поддержкой.

Добрый день.
Я заменил жесткий диск, на котором располагалась папка облака. Старый диск сломался, поэтому перенести данные с него нет возможности. В веб-интерфейсе все мои данные на месте.
Когда я создал пустую папку на новом диске и настроил её в приложении, при синхронизации начали удаляться файлы в облаке.
Как мне настроить приложение на компьютере, чтобы оно считало основной копией веб, а не пустую папку — то есть начало бы скачивать файлы на компьютер, а не удалять их в облаке.
Пробовал скачивать файлы через браузер, но это нереально — их очень много.

К сожалению, восстановить удалённые одновременно и в Облаке, и на ПК файлы
нельзя.

По умолчанию между web-интерфейсом и приложением на компьютере
осуществляется полная двусторонняя синхронизация — если вы удаляете файл из
Облака в web-интерфейсе, то файл удаляется и в приложении, так же и
наоборот: удаляя файл в приложении, вы удаляете файл и в Облаке.

Возможно, я не совсем явно обозначил свою проблему, попробую перефразировать.

Все мои файлы на данный момент есть в облаке. Я купил новый HDD и хочу эти файлы на него скачать. Но когда я создал на нем пустую папку и указал её в приложении, вместо скачивания файлов из облака на компьютер, файлы начали удаляться из облака.

Как мне запустить процесс в обратном направлении — скачать всё из облака на компьютер, не используя веб-интерфейс.

Если это невозможно сделать через приложение, есть ли какие-то альтернативные инструменты? WebDav, как я понимаю, еще не реализован?

На текущий момент данная функциональность отсутствует.

Ваше замечание передано разработчикам.

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

UPD4: Bulldozavr написал, что, похоже, это удаляются системные файлы Thumbs.db и desktop.ini. Я запустил синхронизацию и не стал её останавливать — действительно, периодически в статусе было видно такие файлы (но из-за того, что ширина контекстного меню ограничена, а доступного файла лога нет, пользователю убедиться, что удаляются только эти файлы невозможно).
Спустя пару минут все системные файлы, судя по всему, удалились и началась закачка из облака на компьютер, как и должно быть.
Вердикт следующий: синхронизация работает нормально, хоть и пугает поначалу пользователя удалением файлов из облака; тех. поддержка работает плохо.
Ну а мой опыт написания консольных приложений на php уже никуда не денется :)

Избавляемся от вирусов

Заражение компа может случиться с каждым. И чтобы жизнь компьютерная надолго не прерывалась, хотелось бы поскорее вычистить вирус, да еще и так, чтобы само собой, не так ли? И это вполне решаемая проблема. Для начала коротко о главном — в чем проблема?

Первое — не все вирусы можно удалить утилитами и антивирусами (если вы уже скачали Cureit, Emsisoft Emergency Kit, AVP tool, Comodo Cleaning Essentials, Norman Malware Cleaner, но они не помогли, то стоит заподозрить в заражении БИОС, роутер), тут придется попотеть, но не волнуйтесь — это не так уж и сложно. Второе — пока все заново скачаешь можно просто со скуки умереть! А вдруг что-то потеряешь? Ну какой то важный фильм, который был заложен не в ту папку, а потом еще долго искать его заново. Тут нужна автоматизация — чтобы одна программа нам помогла и скачать и рассортировать.

Для начала прячем файлы надежное место

Предлагаю такую схему — для очистки винды ее нужно переустановить (и форматнуть все диски), но сначала нужно спасти важные файлы (музыку и т.д.). Для этого устанавливаем программу Облако Mail ru. Внимание! Чтобы в это облако влезли все ваши музыка и фильмы (ну или самая важная часть — не более 1ТБ) укажите папку размещения на диске Д (или какой он у вас по счету). После того, как она появится, в нее перемещаем музыку и фильмы — теперь остается набраться терпения и подождать. Эта софтина сама выгрузит все ваши медиа файлы в облако. Причем будет сохранена вся структура папок.

Удаляем вирусы в облаке

Теперь можно быть жестоким к вирусу!

Вот теперь можно просто отформатировать ВСЕ жесткие диски и переустановить винду. Где взять образ установочного диска уже писал здесь. А можно установить Линукс. После чего и в Винде и в Линуксе можно установить Облако Mail ru и закачать файлы из облака обратно на жесткий диск. Вся привычная вам структура каталогов будет воссоздана в точности, как на том компе, с которого вы их выгружали в облако.

ПЫ.СЫ. Для максимума безопасности, рекомендую перед переустановкой системы очистить БИОС и роутер (если он есть).

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

ПЫ.ПЫ.СЫ. Если вы искали старую версию этой статьи, то она здесь. Предложенный тут метод проще, хотя если вы горите желанием освоить нечто новое, то старый метод может прийтись вам по вкусу тоже.

Таким образом, достаточно сохранить все свои любимые медиа файлы в надежном месте, которое доступно для вас и не доступно для других и полное форматирование всех дисков (самый пресамый эффективный метод борьбы с вирусами) уже легко применимо. А остальное — дело техники! Удачи!

Читайте также: