8

我尝试通过 html5 音频标签播放一些 mp3 文件。对于桌面来说,这很好用(使用 Chrome),但对于移动浏览器(还有 Chrome(适用于 Android)),似乎存在一些困难:

我用一些密码保护了流,因此流服务器需要找到一个特殊的身份验证 cookie(spring security remember-me)。但不知何故,当移动浏览器通过音频标签访问 mp3 流时,它不会发送此 cookie。当我将流 URL 直接输入到地址栏时,一切正常。

当我搜索丢失的 cookie 时,我发现移动浏览器仍然发送一些 cookie(例如 JSESSIONID)但不是全部。进一步的调查(使用 PHP 的快速 PoC)显示移动浏览器似乎拒绝通过设置了 HttpOnly 标志的音频标签发送 cookie。所以我的问题是:

这是一种指定的行为,为什么移动版和桌面版(Chrome)之间存在差异,有没有办法从客户端控制行为?

4

2 回答 2

10

通过更深入地研究我发现的 HTTP 包,Android 浏览器本身并不请求 mp3 流,而是将其委托给 stagefright(一些 android 多媒体客户端)。快速搜索显示,对于旧的 Android 版本(4.0 之前)stagefright 无法处理 cookie:

我自己的测试证实了这一点。旧的 stagefright (Android 2.3.x) 根本不发送任何 cookie,来自欧洲 S3 (android 4.1.2, stagefright 1.2) 的 stagefright 只发送没有 httpOnly 标志的 cookie。

所以我认为每个人都必须自己决定他想使用哪种解决方案:

  • 启用 httpOnly:android 根本无法访问,但它是安全的
  • 禁用 httpOnly:针对 XSS 的安全性较低,但适用于 Android >4.0
  • 完全禁用 cookie 身份验证:不安全但适用于所有人

注意:简单地禁用 httpOnly 的问题在于,您会使整个应用程序容易受到 cookie 劫持者的攻击。另一种可能的解决方案是为流设置一个特殊的 rememberme cookie(没有 httpOnly)和另一个启用了 httpOnly 的 rememberme cookie。

于 2013-05-06T18:57:36.500 回答
0

我遇到了同样的问题,在 cookie 上禁用 HttpOnly 或 Secure 标志并不能解决 Android 4.2 和 4.4 chrome 浏览器上的问题。

最后我找到了原因。我有一个 cookie,其值包含特殊字符冒号 (:) 和管道 (|) 等。在禁用带有特殊字符的 cookie 后,视频在 Android 4.2 和 4.4 中可以正常播放。

希望这可以帮助某人。

于 2015-06-30T21:17:13.473 回答