Мобильные браузеры отправляют файлы cookie httpOnly через HTML5 Audio-Tag?
Я пытаюсь воспроизвести некоторые mp3-файлы через аудио-тег html5. Для настольных компьютеров это прекрасно работает (с Chrome), но когда дело доходит до мобильных браузеров (также Chrome (для Android)), возникают некоторые трудности:
Я защитил поток с помощью некоторого пароля, поэтому потоковому серверу необходимо найти специальный файл cookie для аутентификации (весенняя защита, запомните меня). Но каким-то образом мобильный браузер не отправляет этот cookie, когда он получает доступ к mp3-потоку через аудиотег. Когда я ввожу поток URL прямо в адресную строку, все работает просто отлично.
Пока я искал потерянный файл cookie, я обнаружил, что мобильный браузер все еще отправляет некоторые файлы cookie (например, JSESSIONID), но не все. Дальнейшие исследования (быстрый PoC с PHP) показали, что мобильный браузер, похоже, отказывается отправлять куки через аудио-тег с установленным флагом HttpOnly. Итак, мой вопрос:
Является ли это определенным поведением, почему существуют различия между мобильной и настольной версиями (Chrome) и есть ли способ управления поведением со стороны клиента?
2 ответа
Посмотрев более подробно на HTTP-пакеты, я обнаружил, что браузер Android не запрашивает сам mp3-поток, а делегирует его на stagefright (некоторый мультимедийный клиент для Android). Быстрый поиск показал, что для старых версий Android (до 4.0) stagefright не может обрабатывать куки:
- https://code.google.com/p/android/issues/detail?id=17553 <- (Статус: спам) WTF...
- https://code.google.com/p/android/issues/detail?id=17281
- https://code.google.com/p/android/issues/detail?id=10567
- https://code.google.com/p/android/issues/detail?id=19958
Мои собственные тесты подтвердили это. Старый stagefright (Android 2.3.x) вообще не отправляет куки, европейский S3 (android 4.1.2, stagefright 1.2) отправляет только куки, которые НЕ имеют флаг httpOnly.
Поэтому я думаю, что каждый должен сам решить, какое решение он хочет использовать:
- включить httpOnly: Android не имеет никакого доступа, кроме его безопасного
- отключить httpOnly: менее защищен от XSS, но работает для Android >4.0
- отключить проверку подлинности на основе файлов cookie: небезопасно, но работает для всех
Примечание. Проблема с простым отключением httpOnly заключается в том, что все ваше приложение становится уязвимым для угонщиков файлов cookie. Другим возможным решением было бы иметь специальный cookie-файл Rememberme для потока (без httpOnly) и другой cookie-файл Rememberme с включенным httpOnly.
У меня была та же проблема, и отключение флагов HttpOnly или Secure на файлах cookie не решило проблему в браузере Chrome на Android 4.2 и 4.4.
Наконец я понял причину. У меня был cookie со значением, содержащим специальные символы двоеточие (:) и pipe ( |) и т. Д. После отключения этого cookie со специальными символами видео нормально воспроизводится в Android 4.2 и 4.4.
Надеюсь, это кому-нибудь поможет.