Граблі VK SDK для Android

Привіт Хабр! Нещодавно знадобилося інтегрувати соц. мережа у проекті для Android. Вибір припав на ВК і, відповідно, їх офиц.бібліотеку VKCOM/vk-android-sdk. Використовував її раніше і ще тоді не був від неї в захваті з-за малої кількості прикладів. Зараз дивлюся у вихідний код, а він все також далеко не ідеальний.

Зазвичай завжди переглядаю ключі в преференсах при запуску програми і побачив ось таке (після авторизації):

Ключ: VK_SDK_ACCESS_TOKEN_PLEASE_DONT_TOUCH
Значення: scope=offline&https_required=1&access_token=e5cd068be722caafd3c449557e19c19eeed3f54c295a65cd097ed087f61c44394bd985975364fc34641cc&expires_in=0&created=1476876628588&user_id=220436550

Насторожило. Не думаю, що це добре зберігати такі дані у відкритому вигляді. Взагалі, ще після першого знайомства думав про можливості зчитування даних, що вводяться при авторизації. Чому б ні?

Потрібно всього лише імпортувати модуль. Прибираємо можливість авторизації через основного клієнта (залишаємо другий варіант):

if (VKUtil.isAppInstalled(ctx, VK_APP_PACKAGE_ID)
&& VKUtil.isIntentAvailable(ctx, VK_APP_AUTH_ACTION)
&& fingerprints.length > 0
&& fingerprints[0].equals(VK_APP_FINGERPRINT)) {
if (savedInstanceState == null) {
intent = new Intent(VK_APP_AUTH_ACTION, null);
intent.setPackage(VK_APP_PACKAGE_ID);
intent.putExtras(bundle);
startActivityForResult(intent, VKServiceType.Authorization.getOuterCode());
}
} else {
new VKOpenAuthDialog().show(this, bundle, VKServiceType.Authorization.getOuterCode(), null);
}

» Ісходник тут

Трохи модернізуємо їх кастомный webview:

@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
return new BaseInputConnection(this, 'false');
}

@Override
public boolean dispatchKeyEvent(KeyEvent event) {
super.dispatchKeyEvent(event);
// Без умови event дублюється
if (event.getAction() == KeyEvent.ACTION_UP) {
Log.d("TAG", event.getKeyCode() + " | " + event.toString());
}
return true;
}

» Ісходник тут

Спасибі відповіді на StackOverFlow. Виходить пароль і логін повністю зчитується при ручному введенні в їх діалоговому вікні (без копіпаста). Можна визначити навіть регістр символу:

Висновок logcat7 | KeyEvent { action=ACTION_UP, keyCode=KEYCODE_0, ..., source=0x0 }
59 | KeyEvent { action=ACTION_UP, keyCode=KEYCODE_SHIFT_LEFT, ..., source=0x0 }
40 | KeyEvent { action=ACTION_UP, keyCode=KEYCODE_L, ..., source=0x0 }
Все це відкриває широкі можливості. Можливо ще можна підібрати схожі приклади.
Я невеликий спеціаліст у cookies, але, наприклад, вдається витягнути поля
remixstid, remixmdevice, remixlang, remixlhk.
Схоже вони стосуються даних про токені, судячи з опису функції виходу для запису в основному класі.

/**
* Wipes out information about the access token and clears cookies for internal browse
*/
@SuppressLint("NewApi")
public static void logout) {
...
CookieManager.getInstance().removeAllCookies(null);
...
}

» Ісходник тут

Думаю для ВК краще повністю перенести атестацію на основного клієнта. А що стосовно API, наповнити докладними прикладами (Wiki на GitHub непоганий додаток javadoc наявному). Але зараз використовувати такий підхід сумнівно.

Спасибі за увагу!
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.