【问题标题】:Differentiating HTTPOnly cookies from other in android将 HTTPOnly cookie 与 android 中的其他 cookie 区分开来
【发布时间】:2014-08-25 14:36:51
【问题描述】:

在我当前的项目中,我们正在实现 Android 应用程序和服务器之间的会话处理。 现在按照我们的设计,Android 应用程序应该只接受 HTTP Cookie 并删除所有其他 cookie。 但是查看所有可用选项,我找不到任何类或方法可以帮助我识别 cookie 是否为 HTTPOnly。

我以以下方式存储 cookie:

        connections = (HttpURLConnection) serverURL.openConnection();
        // Setting cookies manager
        java.net.CookieManager manager = new java.net.CookieManager();
        manager.setCookiePolicy(new CookiePolicy() {
            
            @Override
            public boolean shouldAccept(URI uri, HttpCookie cookie) {
                return cookie.getSecure();
            }
        });
        CookieHandler.setDefault(manager);

        connections.setDoInput(true);
        connections.setDoOutput(true);
        connections.setConnectTimeout(TIME_OUT);

        connections.getOutputStream().write(data);

        InputStream inputStream = connections.getInputStream();
        CookieStore cookieJar = manager.getCookieStore();
        if (cookieJar != null) {
            List<HttpCookie> cookies = cookieJar.getCookies();
            for (HttpCookie httpCookie : cookies) {
                
                Log.i("yash", httpCookie.toString());
            }
        }

但是这个HttpCookie 没有任何HTTPOnly 方法。

通过一些谷歌浏览,我发现RFC 6265 具有 HTTPOnly 属性,并且它也屏蔽了 RFC 2965。但是为什么谷歌不支持这个 RFC 6265?

【问题讨论】:

  • 很惊讶在 Android 上没有看到任何解决方法。我看到有关任何带有 httpOnly 标志的 cookie 是否会受到 Android 浏览器限制的信息存在冲突,即使您设法设置了标志(从服务器或通过客户端)。 Google 自己的 browser security doc 将 Android 列为唯一不支持 httpOnly 的平台,但我不确定该表的过时程度。

标签: java android cookies httponly


【解决方案1】:

根据the class documentation HttpOnly 受支持,但由于某种原因,该字段没有任何访问器或修改器。

为了能够访问和修改 httpOnly 字段,您应该使用反射:

// Workaround httpOnly (getter)
private boolean getHttpOnly() {
    try {
        Field fieldHttpOnly = cookie.getClass().getDeclaredField("httpOnly");
        fieldHttpOnly.setAccessible(true);

        return (boolean) fieldHttpOnly.get(cookie);
    } catch (Exception e) {
        // NoSuchFieldException || IllegalAccessException ||
        // IllegalArgumentException
        Log.w(TAG, e);
    }
    return false;
}

// Workaround httpOnly (setter)
private void setHttpOnly(boolean httpOnly) {
    try {
        Field fieldHttpOnly = cookie.getClass().getDeclaredField("httpOnly");
        fieldHttpOnly.setAccessible(true);

        fieldHttpOnly.set(cookie, httpOnly);
    } catch (Exception e) {
        // NoSuchFieldException || IllegalAccessException ||
        // IllegalArgumentException
        Log.w(TAG, e);
    }
}

【讨论】:

  • 嗨 franmontiel,您知道上述反射方式的其他替代方法吗(因为它在 Android Pie 中被列入黑名单)?
猜你喜欢
  • 2016-05-18
  • 1970-01-01
  • 1970-01-01
  • 2015-12-19
  • 1970-01-01
  • 1970-01-01
  • 2019-08-03
  • 2012-06-07
  • 1970-01-01
相关资源
最近更新 更多